我在Rust中有以下代码,我想将其翻译成Java,所以我首先需要理解代码。
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 :(得分:2)
如果Option<String>
有一个值,那么它的迭代器将有一个要迭代的元素。
如果Option<String>
没有值,那么它的迭代器将有0个要迭代的元素。
换句话说,a
中的let a = simple.id.iter().len();
是simple.id
中元素的数量,如果有id,则为1,如果没有,则为0。
([{1}}的实际计算发生在len
,您可以看到它的来源here)。
如果是Java,您可以使用Item.size_hint
,如
null
来自Java 8的或Optional,如
public class SimpleSelector {
public String tag_name;
public String id;
public ArrayList<String> clazz;
}
// ...
int a = id == null ? 0 : 1;
答案 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
相比,它有一个缺点。在Rust中,这永远不会编译:
fn thing(id: Option<String>) {
id.len(); // id could be `Some` or `None`!
}
但null
- 在Java中使用等价物会编译但在运行时可能会爆炸:
public static void thing(String id) {
id.length(); // id could be null or not-null!
}