2015-02-28 9 views
5

Zgodnie z dla iteratorów są tacy konsumenci jak find i fold.Dlaczego metoda fold podaje rzeczywisty element zamiast odniesienia?

Służą one jako:

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

i

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

W obu przypadkach x jest aktualna wartość. Jednak w pierwszym przypadku x jest odniesieniem, aw drugim przypadku jest to sam element.

O ile rozumiem z pętli for, musi to być odniesienie, aby uniknąć problemów właściciela. Ale czy nie powinno być problemu z tym samym właścicielem w przypadku foldowania?

Odpowiedz

5

Problem jest trochę trudne do wytłumaczenia z liczb całkowitych, ponieważ są one Copy, więc porównać:

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() 

W pierwszym przypadku String należy zwrócić się do rozmówcy, więc nie możemy mieć zamknięcie go zniszczyć (co byłoby, gdyby zostało przekazane przez wartość). W drugim, wartości nie są już używane po wywołaniu zamknięcia, więc można je przekazać do zamknięcia według wartości (co pozwala nam konsumować String, gdy dołączymy do niego).

+1

Ok, chodzi o to, że 'find' zwraca jedną z jego wartości, podczas gdy' fold' zawsze zwraca nową (złożoną) wartość. Dzięki. – michas

Powiązane problemy