Передача объекта в замыкание


#1

Пишу websocket клиент при помощи библиотеки ws. Нужно передать мутабельную ссылку на объект в замыкание в функции connect с целью её дальнейшего использования:

struct Client<'a>; {
Obj: &'a mut ObjType,
}

impl<'a> Handler for Client<'a> {
fn on_open(&amp;mut self, _:Handshake) -> Result<()> {
//...
}

fn on_message(&amp;mut self, msg: Message) -> Result<()> {
//...
}
}

connect(URL, |_out| Client{Obj: &mut Obj})

Но что-то я тут намудрил с временем жизни. Возможно ли вообще передать туда мутабельную ссылку, или всё же нужно копировать объект?


#2

Если бы в определении функции connect() было FnOnce() вместо FnMut(), то так могло бы работать (playground). Но наверно какие-то причины были так сделать. Можно попробовать ишью кинуть разработчику ws.


#3

откровенно не понял вопроса и не понял приведенного кода.
совсем.


#4

Предполагается, что я создал объект Obj с типом ObjType и хочу передать мутабельную ссылку на него в замыкание в функции connect с целью последующего использования этой ссылки в методах on_open и on_message. Вопрос в том, как так сделать, если возможно.


#5

пример кода, в https://play.rust-lang.org/ , есть?
move использовали?


#6

Если ObjType создается в connect, то естественно, невозможно отдать ссылку на него за пределы функции. Поскольку стековый фрейм, в котором действует функция, будет зачищен по выходу из нее, все созданные в ней значения также, и ссылки на эти значения станут указывать на “мусор”. Видимо, это как раз твой случай.
Зачем вообще хранить в поле структуры ссылку на объект? Ведь объект должен где-то жить. Экземпляры ObjType хранятся где-то отдельно статически или хотя бы дольше, чем будут жить ссылки на них? Это единственный вариант, при котором твой код будет работоспособным.


#7

ObjType создаётся до вызова connect, просто мне нужно обращаться к этому объекту из on_open и on_message.


#8

Ссылка на экземпляр ObjType по логике должна жить не меньше, чем живет этот экземпляр, если только нет особых условий. Тебе надо привязать время жизни ссылки ко времени жизни объекта. Попахивает необходимостью использования PhantomData.