小编Tim*_*ean的帖子

使用结果迭代器最常用的方法是什么?

我有这样的代码:

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<_>, _>>,它很有效.我特意试图消除以下样板:

  • 在过滤器的关闭,我必须使用matchthing_result.我觉得这应该只是一个单行,例如.filter_if_ok(|thing| check(a)).
  • 每次我使用时map,我都要包含一个额外的声明let a = try!(thing_result);,以便处理一个可能性Err.再一次,我觉得这可以被抽象出来.map_if_ok(|thing| ...).

有没有其他方法可以用来获得这种简洁程度,或者我只是需要强硬一点?

iterator filterfunction rust map-function rust-result

15
推荐指数
3
解决办法
1万
查看次数

用SymPy求解方程组

我试图用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)

但这似乎没有效果.

在此先感谢您的帮助!

python sympy

14
推荐指数
1
解决办法
1万
查看次数

在Rust中逐个字符地读取文件

在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,但文件可能很大,我不想把它全部读入内存.

io rust

14
推荐指数
1
解决办法
4059
查看次数

x86汇编中的高效mod 3

DIV指令在现代处理器上很昂贵.有没有更快的方法来减少x86汇编中的64位整数mod 3?

assembly x86-64 micro-optimization

6
推荐指数
1
解决办法
777
查看次数