Пишу websocket клиент при помощи библиотеки ws. Нужно передать мутабельную ссылку на объект в замыкание в функции connect с целью её дальнейшего использования:
Если бы в определении функции connect() было FnOnce() вместо FnMut(), то так могло бы работать (playground). Но наверно какие-то причины были так сделать. Можно попробовать ишью кинуть разработчику ws.
Предполагается, что я создал объект Obj с типом ObjType и хочу передать мутабельную ссылку на него в замыкание в функции connect с целью последующего использования этой ссылки в методах on_open и on_message. Вопрос в том, как так сделать, если возможно.
Если ObjType создается в connect, то естественно, невозможно отдать ссылку на него за пределы функции. Поскольку стековый фрейм, в котором действует функция, будет зачищен по выходу из нее, все созданные в ней значения также, и ссылки на эти значения станут указывать на “мусор”. Видимо, это как раз твой случай.
Зачем вообще хранить в поле структуры ссылку на объект? Ведь объект должен где-то жить. Экземпляры ObjType хранятся где-то отдельно статически или хотя бы дольше, чем будут жить ссылки на них? Это единственный вариант, при котором твой код будет работоспособным.
Ссылка на экземпляр ObjType по логике должна жить не меньше, чем живет этот экземпляр, если только нет особых условий. Тебе надо привязать время жизни ссылки ко времени жизни объекта. Попахивает необходимостью использования PhantomData.