Эта первоначальная попытка не может сработать, потому что вы не можете вернуть ссылку на что-то, созданное в функции . В этом случае возвращение чего-то эквивалентного методу локально созданному значению структуры требует, чтобы это значение также пережило время жизни функции.
Мы можем ссылаться на метод bar
в структуре Foo
с помощью Foo::bar
, но этот не привязан к значению получателя. Не существует синтаксиса специально для ссылки на вызов метода для значения. Вместо этого решение состоит в том, чтобы создать замыкание, которое захватывает значение и вызывает метод .
let foo = Foo::new();
move || foo.bar()
Учитывая эту Fish
структуру и реализацию (скорректированную в соответствии с соглашениями об именах ):
struct Fish {
weight: usize,
}
impl Fish {
fn weight(&self) -> usize {
self.weight
}
}
Функция, возвращающая другую самодостаточную функцию, будет записана так:
fn fish_weight() -> impl Fn() -> usize {
let r#catch = Fish { weight: 12 };
move || r#catch.weight()
}
Использование:
let get = fish_weight();
println!("Fish weight: {}", get());
Детская площадка