Метод по значению в Rust
Первый параметр можно записать без ссылки. Тогда метод получает само значение целиком и забирает владение. После вызова старое имя снаружи больше не живо: к нему нельзя обратиться ни для поля, ни для второго вызова.
Запишем метод, который забирает пользователя и возвращает только возраст:
struct User {
name: &'static str,
age: i32,
}
impl User {
fn into_age(self) -> i32 {
self.age
}
}
Создадим значение и вызовем метод:
let user = User { name: "ann", age: 20 };
let years = user.into_age();
println!("{}", years);
На экране 20. Число скопировали в
результат, а структура осталась внутри метода
и была уничтожена в конце вызова. Имя
user после этого использовать нельзя.
Такой прием удобен, когда значение нужно разобрать на части и больше не хранить целиком:
struct Pair {
left: i32,
right: i32,
}
impl Pair {
fn sum(self) -> i32 {
self.left + self.right
}
}
Разберем пару и выведем сумму:
let pair = Pair { left: 3, right: 4 };
let total = pair.sum();
println!("{}", total);
Дана структура:
struct User {
name: &'static str,
age: i32,
}
let user = User { name: "bob", age: 30 };
Добавьте метод без ссылки, который возвращает
поле age, вызовите его и выведите
результат.
Дана структура:
struct Box {
weight: i32,
}
let item = Box { weight: 10 };
Запишите метод, который забирает значение
и возвращает weight. Выведите число
и скажите, можно ли после этого прочитать
item.
Дан следующий код:
struct User {
name: &'static str,
age: i32,
}
impl User {
fn into_age(self) -> i32 {
self.age
}
}
let user = User { name: "leo", age: 25 };
let years = user.into_age();
Скажите, соберется ли обращение к user.name
после строки с years.