2015-02-28 6 views
5

Secondo gli rust book per gli iteratori ci sono consumatori come find e fold.Perché il metodo di piegatura fornisce l'elemento effettivo anziché un riferimento?

Sono usati come:

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

e

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

In entrambi i casi x è il valore corrente. Tuttavia nel primo caso x è un riferimento e nel secondo caso è l'elemento stesso.

Per quanto ho capito dal ciclo for, deve essere un riferimento per evitare problemi del proprietario. Ma non dovrebbe esserci lo stesso problema del proprietario nel caso fold?

risposta

5

La questione è un po 'difficile da spiegare con gli interi, dal momento che sono Copy, in modo da confrontare:

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

Nel primo caso, le String deve essere restituito al chiamante, quindi non possiamo avere la chiusura lo distrugge (cosa che succederebbe se fosse passato per valore). Nel secondo, i valori non vengono più utilizzati dopo la chiamata alla chiusura, quindi possono essere passati alla chiusura per valore (che ci consente di consumare il String quando lo aggiungiamo).

+1

Ok, il punto è che 'find' restituisce effettivamente uno dei suoi valori, mentre' fold' restituisce sempre un nuovo valore (composto). Grazie. – michas

Problemi correlati