[英]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());
}
该代码(具体地说,称为匹配臂)具有三个相关部分: c
, if 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.