Lorsque je passe un objet par référence à la méthode new()
d'une structure et que la structure possédera l'objet, est-il plus conventionnel de:
to_owned()
dans le new()
new()
, et passer par valeur, en le déplaçantJe peux penser aux avantages et aux inconvénients de chacun en termes de clarté et de séparation des préoccupations.
#[derive(Clone)]
struct MyState;
struct MyStruct {
state: MyState,
}
impl MyStruct {
pub fn new_by_ref(state: &MyState) -> Self {
MyStruct {
state: state.to_owned(),
}
}
pub fn new_by_val(state: MyState) -> Self {
MyStruct { state }
}
}
fn main() {
let state1 = MyState;
let struct1 = MyStruct::new_by_ref(&state1);
let state2 = MyState;
let struct2 = MyStruct::new_by_val(state2.clone());
}
Passez par la valeur.
De cette manière, le programme peut éviter de doubler inutilement la valeur si l'appelant n'en a plus besoin.
Dans de nombreux cas, je recommande d'accepter tout ce qui peut être fait into le type possédé. Ceci est facilement démontré avec String
:
struct MyStruct {
state: String,
}
impl MyStruct {
fn new(state: impl Into<String>) -> Self {
let state = state.into();
MyStruct { state }
}
}
fn main() {
let struct1 = MyStruct::new("foo");
let struct2 = MyStruct::new(String::from("bar"));
}
Voir également: