在Java中等效Rust的匹配语句

时间:2014-12-13 10:26:28

标签: java rust

我几乎可以理解以下代码,但请告诉我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());
}

1 个答案:

答案 0 :(得分:4)

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

c是模式:也就是说,它告诉编译器要匹配哪些值,以及如何对它们进行解构。以前所有的武器都使用了文字模式,因此它们只是与特定的角色匹配,并且不会捕捉任何东西。 模式具有变量绑定c,这意味着它将匹配任何,并且它匹配的任何内容都应绑定到变量c。< / p>

  

顺便说一下:您可以使用以下模式:Some(x),表示该手臂应与Option的值Some匹配,并且内容< / {>其中Some应绑定到变量x

if ...被称为条件守卫。所做的就是对手臂施加额外的限制。它使得无论模式和匹配的值,除非条件评估为true,否则整个arm无法匹配。因此,虽然模式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表达式总是很好地映射到交换机,尤其是,如果它们进行复杂的解构。