2014-12-13 16 views
0

我有鏽下面的代碼,我希望把它翻譯成Java,所以我需要了解的代碼在第一。什麼是鐵鏽的選項::在Java中ITER的相同呢?

pub struct SimpleSelector { 
    pub tag_name: Option<String>, 
    pub id: Option<String>, 
    pub class: Vec<String>, 
} 

impl Selector { 
    pub fn specificity(&self) -> Specificity { 
     // http://www.w3.org/TR/selectors/#specificity 
     let Selector::Simple(ref simple) = *self; 
     let a = simple.id.iter().len(); 
     let b = simple.class.len(); 
     let c = simple.tag_name.iter().len(); 
     (a, b, c) 
    } 
} 

我面對這行代碼的問題:

let a = simple.id.iter().len(); 
+0

家長質疑:http://stackoverflow.com/questions/27461207 /什麼,做串 - ITER-DO功能於生鏽。可能的答案:http://stackoverflow.com/a/23873769/257568。 – ArtemGr 2014-12-13 19:01:17

+0

所以'了'爲0如果id爲「無」,和1如果是「一些」。有更清晰的方法來寫!例如'self.id.is_some()as uint'。 :) – bluss 2014-12-14 23:21:34

回答

2

如果Option<String>具有價值,那麼它的迭代器將不得不遍歷一個元素。

如果Option<String>沒有值,然後迭代器具有0個元素進行迭代。

換句話說alet a = simple.id.iter().len();simple.id中的元素數,如果存在id,則爲1,如果不存在則爲0。

len的實際計算髮生在Item.size_hint,你可以看到它的來源here)。

如果Java中,你既可以使用null,如

public class SimpleSelector { 
    public String tag_name; 
    public String id; 
    public ArrayList<String> clazz; 
} 
// ... 
int a = id == null ? 0 : 1; 
從Java 8

Optional,如

public class SimpleSelector { 
    public Optional<String> tag_name; 
    public Optional<String> id; 
    public ArrayList<String> clazz; 
} 
// ... 
int a = id.empty() ? 0 : 1; 
2

爲補充@ ArtemGr的回答,你也能想到的Option作爲只能保存0或1個值的集合。 Java代碼可能看起來像:

public class SimpleSelector { 
    public ArrayList<String> tag_name; 
    public ArrayList<String> id; 
    public ArrayList<String> clazz; 
} 
// ... 
int a = id.size(); 

使用null會是很多人的第一選擇,等價,但相比Option它有一個缺點。生鏽,這將永遠不會編譯:

fn thing(id: Option<String>) { 
    id.len(); // id could be `Some` or `None`! 
} 

但在Java中的null - 使用相當於將編譯,但可能會在運行時炸燬:

public static void thing(String id) { 
    id.length(); // id could be null or not-null! 
}