Как вернуть ссылку на метод и структуру, к которой он относится - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть функция, которая создаст одну из нескольких структур (каждая из которых имеет метод с одинаковой сигнатурой, но имеет другие, разные методы и признаки); Я хотел бы создать экземпляр одной из структур в функции и вернуть ссылку на ее метод, который может быть вызван в другом месте. ссылка на эту функцию, а затем вызывать ее, чтобы получить размер.

1 Ответ

0 голосов
/ 19 апреля 2020

Эта первоначальная попытка не может сработать, потому что вы не можете вернуть ссылку на что-то, созданное в функции . В этом случае возвращение чего-то эквивалентного методу локально созданному значению структуры требует, чтобы это значение также пережило время жизни функции.

Мы можем ссылаться на метод 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());

Детская площадка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...