2017-09-20 6 views
2

j'ai écrit ce code qui emprunte une variable mutable plus d'une fois et compile sans erreur, mais selon The Rust Programming Language cela ne devrait pas compilez:Pourquoi plusieurs emprunts mutables sont-ils possibles dans la même portée?

fn main() { 
    let mut s = String::from("hello"); 

    println!("{}", s); 
    test_three(&mut s); 
    println!("{}", s); 
    test_three(&mut s); 
    println!("{}", s); 
} 

fn test_three(st: &mut String) { 
    st.push('f'); 
} 

(playground)

Est-ce un bug ou il y a nouvelle fonctionnalité dans Rust?

Répondre

5

Rien d'étrange ne se passe ici; l'emprunt mutable devient vide à chaque fois que la fonction test_three conclut son travail (ce qui est juste après qu'elle a appelé):

fn main() { 
    let mut s = String::from("hello"); 

    println!("{}", s); // immutably borrow s and release it 
    test_three(&mut s); // mutably borrow s and release it 
    println!("{}", s); // immutably borrow s and release it 
    test_three(&mut s); // mutably borrow s and release it 
    println!("{}", s); // immutably borrow s and release it 
} 

La fonction ne tient pas son argument - il mute seulement String il pointe et libère l'emprunt juste après, car il ne faut plus:

fn test_three(st: &mut String) { // st is a mutably borrowed String 
    st.push('f'); // the String is mutated 
} // the borrow claimed by st is released 
+0

je l'ai écrit il y a un code similaire quelques mois avec le compilateur rouille plus et je suis arrivé erreur de compilation, quelque chose comme ça « ne peut pas emprunter mutable plus d'une fois ». mais maintenant il fonctionne avec la version 1.20. – mojtab23

+2

@ Mojtab23 en fait ce n'est rien de nouveau et devrait fonctionner correctement depuis Rust 1.0; il compile sans problème avec [godbolt's rustc 1.0] (https://rust.godbolt.org). Le code auquel vous faites référence avait probablement une différence significative (même si elle était subtile à première vue). – ljedrz