2014-12-13 35 views
0

我能理解大多是下面的代碼,但請告訴我的含義或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()); 
} 

回答

4

此代碼(具體而言,這就是所謂的匹配手臂)有三個相關部分: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表達式並不總是很好地映射到一個開關,尤其是如果他們做複雜的解構。