我几乎可以理解以下代码,但请告诉我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());
}
答案 0 :(得分:4)
此代码(具体来说,它称为匹配组)有三个相关部分:c
,if 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
表达式总是很好地映射到交换机,尤其是,如果它们进行复杂的解构。