我有这样的代码:
let things = vec![/* ...*/]; // e.g. Vec<String>
things
.map(|thing| {
let a = try!(do_stuff(thing));
Ok(other_stuff(a))
})
.filter(|thing_result| match *thing_result {
Err(e) => true,
Ok(a) => check(a),
})
.map(|thing_result| {
let a = try!(thing_result);
// do stuff
b
})
.collect::<Result<Vec<_>, _>>()
Run Code Online (Sandbox Code Playgroud)
在语义方面,我想在第一个错误后停止处理.
上面的代码有效,但感觉非常麻烦.有没有更好的办法?我查看了类似的文档filter_if_ok,但我没有找到任何东西.
我知道collect::<Result<Vec<_>, _>>,它很有效.我特意试图消除以下样板:
match的thing_result.我觉得这应该只是一个单行,例如.filter_if_ok(|thing| check(a)).map,我都要包含一个额外的声明let a = try!(thing_result);,以便处理一个可能性Err.再一次,我觉得这可以被抽象出来.map_if_ok(|thing| ...).有没有其他方法可以用来获得这种简洁程度,或者我只是需要强硬一点?
我试图用SymPy 0.7.1解决一组方程:
from sympy import *
equations = [
Eq(S('vf'), S('vi + a*t')),
Eq(S('d'), S('vi*t + 1/2*a*t**2')),
Eq(S('a'), S('10')),
Eq(S('d'), S('60')),
Eq(S('vi'), S('5'))
]
print solve(equations)
Run Code Online (Sandbox Code Playgroud)
产生正确的结果,但是以一种奇怪的顺序:
[(-4, 10, 60, -35, 5), (3, 10, 60, 35, 5)]
Run Code Online (Sandbox Code Playgroud)
如何确定哪个值适合哪个变量?变量顺序似乎是任意的. 文档建议提供其他参数:
print solve(equations, var('a'), var('d'), var('t'), var('vi'), var('vf'))
Run Code Online (Sandbox Code Playgroud)
但这似乎没有效果.
在此先感谢您的帮助!
在Rust中,有一种惯用的方法可以一次处理一个字符的文件吗?
这似乎与我追求的大致相同:
let mut f = io::BufReader::new(try!(fs::File::open("input.txt")));
for c in f.chars() {
println!("Character: {}", c.unwrap());
}
Run Code Online (Sandbox Code Playgroud)
但是Read::chars从Rust v1.6.0开始仍然不稳定.
我考虑过使用Read::read_to_string,但文件可能很大,我不想把它全部读入内存.
该DIV指令在现代处理器上很昂贵.有没有更快的方法来减少x86汇编中的64位整数mod 3?
rust ×2
assembly ×1
io ×1
iterator ×1
map-function ×1
python ×1
rust-result ×1
sympy ×1
x86-64 ×1