为什么fold方法提供实际元素而不是引用?

时间:2015-02-28 11:59:49

标签: rust

根据rust book的迭代器,有findfold等消费者。

它们用作:

let greater_than_forty_two = (0..100).find(|x| *x > 42);

let sum = (1..4).fold(0, |sum, x| sum + x);

在这两种情况下,x都是当前值。但是,在第一种情况下,x是引用,在第二种情况下,它是元素本身。

据我所知for循环,它必须是避免所有者问题的参考。但折叠案例中是否应该存在相同的所有者问题?

1 个答案:

答案 0 :(得分:5)

这个问题有点难以用整数来解释,因为它们是Copy,所以比较一下:

let v = vec!["a".to_string(), "b".to_string()];
let result = v.into_iter().find(|s| s.starts_with("b"));
result == Some("b".to_string())

let v = vec!["a".to_string(), "b".to_string()];
let result = v.into_iter().fold("".to_string(), |a, s| s + &a);
result == "ba".to_string()

在第一种情况下,String需要返回给调用者,因此我们不能让闭包破坏它(如果它是通过值传递的话会发生)。在第二个中,在调用闭包之后不再使用这些值,因此它们可以通过值传递给闭包(这允许我们在追加它时使用String。)