是否有更直接,更易读的方法来完成以下任务:
fn main() {
let a = [1, 2, 3];
let b = [4, 5, 6];
let c = [7, 8, 9];
let iter = a.iter()
.zip(b.iter())
.zip(c.iter())
.map(|((x, y), z)| (x, y, z));
}
Run Code Online (Sandbox Code Playgroud)
也就是说,如何从n个迭代中构建迭代器,从而产生n元组?
我有这个代码.
if let Ok(file) = env::var("CONF") {
if let Ok(mut reader) = fs::File::open(&file) {
if let Ok(conf) = Json::from_reader(&mut reader) {
// do something with conf
}
}
}
Run Code Online (Sandbox Code Playgroud)
我试图让它不像一个节日假日树,并考虑链接.注意,在这个链条的每一步产生另一种Result,所以显然这是不行的(我们得到Result的Result).
let conf = env::var("CONF")
.map(fs::File::open)
.map(Json::from_reader);
// do something with conf
Run Code Online (Sandbox Code Playgroud)
另外我的错误类型的每一步,这意味着我不能只更换不同.map使用.and_then.
我想我正在寻找类似于JavaScript承诺的东西.也就是说,从承诺内部返回的承诺揭开了内在的承诺.签名可能应该是这样的:
impl<T, E> Result<T, E> {
fn map_unwrap<F, U, D>(&self, op: F) -> Result<U, D>
where F: FnOnce(T) -> Result<U, D>
}
Run Code Online (Sandbox Code Playgroud)
Rust中有这样的机制吗?有没有另一种方法摆脱我的节日假日树?
我正在解析一个令牌的矢量,每个枚举类型.这意味着我得到了很多代码:
if v.len() >= 3 {
if let Token::Type1(value1) = &v[0] {
if let Token::Type2(value2) = &v[1] {
if let Token::Type(value3) = &v[2] {
return Parsed123(value1, value2, value3);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这非常难看 - 我已经知道我可以做到这一点,使它更好一点:
if v.len() >= 3 {
if let (Token::Type1(value1), Token::Type2(value2), Token::Type3(value3)) =
(&v[0], &v[1], &v[2])
{
return Parsed123(value1, value2, value3);
}
}
Run Code Online (Sandbox Code Playgroud)
但老实说,它并没有好多少.
然而,有一些封闭的问题/ RFC用于链接这些条件,并且"如果让"位在感觉更符合人体工程学的方式 - eRFC 2497的跟踪问题"if- and while-let-chains取2"并且支持&& in if让表达式 - 这会让我写下这样的东西:
if v.len() >= 3 &&
let Token::Type1(value1) = &v[0] && …Run Code Online (Sandbox Code Playgroud)