繁体   English   中英

在Java中等效于Rust的match语句

[英]Equivalent of Rust's match statement in Java

我基本上可以理解以下代码,但是请告诉我Java的含义或等效内容

while !self.eof() {
    match self.next_char() {
        '#' => {
            self.consume_char();
            selector.id = Some(self.parse_identifier());
        }
        '.' => {
            self.consume_char();
            selector.class.push(self.parse_identifier());
        }
        '*' => {
            // universal selector
            self.consume_char();
        }
        c if valid_identifier_char(c) => {
            selector.tag_name = Some(self.parse_identifier());
        }
        _ => break
    }
}

该代码的目的是什么?

c if valid_identifier_char(c) => {
    selector.tag_name = Some(self.parse_identifier());
}

该代码(具体地说,称为匹配臂)具有三个相关部分: cif valid_identifier_char(c)和块{ selector.tag_name ... }

c是模式:即,它告诉编译器要与之匹配的值以及如何对其进行解构。 先前的所有分支都使用文字模式,因此它们仅与特定字符匹配,不捕获任何内容。 模式具有变量绑定c ,这意味着它将匹配任何内容 ,并且匹配的任何内容都应绑定到变量c

顺便说一句:你可以有状图案: Some(x)这表明该臂应该匹配的Option ,其值是一个Some ,而那内容 Some应当绑定到变量x

if ...被称为状态守卫。 所有要做的就是对手臂施加额外的限制。 这样可以确保, 无论模式和值是否匹配, 除非条件评估为true 否则手臂整体都无法匹配。 因此,尽管模式c可以匹配任何值,但除非有效的valid_identifier_char(c)true否则整个手臂都不匹配。

最后,该块只是手臂匹配时将执行的代码。

我对Java不太了解,但是我相信代码大致等同于:

// Actually should be "unsigned long", but Java.
long _temp = this.next_char();
switch _temp {
    case 35:
        // First branch...
        break;

    case 46:
        // Second branch...
        break;

    case 42:
        // Third branch...
        break;

    default:
        long c = _temp;
        if valid_identifier_char(c) {
            // Fourth branch...
        } else {
            // Final branch...
        }
        break;
}

但是,通常, match表达式并不总是能很好地映射到开关, 尤其是当它们执行复杂的结构分解时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM