为什么 fold 方法给出实际元素而不是引用?
Why does the fold method give the actual element instead of a reference?
根据迭代器的 rust book,有像 find
和 fold
这样的消费者。
它们被用作:
let greater_than_forty_two = (0..100).find(|x| *x > 42);
和
let sum = (1..4).fold(0, |sum, x| sum + x);
在这两种情况下,x
是当前值。但是在第一种情况下 x
是一个引用,在第二种情况下它是元素本身。
据我从 for
循环中了解到,它必须是避免所有者问题的参考。但是fold case不应该有same owner的问题吗?
这个问题有点难以用整数来解释,因为它们是 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
)。
根据迭代器的 rust book,有像 find
和 fold
这样的消费者。
它们被用作:
let greater_than_forty_two = (0..100).find(|x| *x > 42);
和
let sum = (1..4).fold(0, |sum, x| sum + x);
在这两种情况下,x
是当前值。但是在第一种情况下 x
是一个引用,在第二种情况下它是元素本身。
据我从 for
循环中了解到,它必须是避免所有者问题的参考。但是fold case不应该有same owner的问题吗?
这个问题有点难以用整数来解释,因为它们是 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
)。