Вышеприведенный код не работает, и понятно, что перемещение значения из self нарушает целостность.
Это не совсем то, что здесь происходит. Например, то же самое с
self
будет работать красиво:impl
Foo { fn switch(self) { self = match self { Foo::Bar(val) => Foo::Baz(val), Foo::Baz(val) => Foo::Bar(val), } } } Ржавчина абсолютно прекрасна с частичным и полным ходом. Проблема здесь в том, что вы не владеете значением, которое вы пытаетесь переместить - у вас есть только изменяемая заимствованная ссылка. Вы не можете отойти от каких-либо ссылок, в том числе изменчивых.
Это на самом деле одна из часто запрашиваемых функций - особый вид ссылки, который позволил бы выйти из него. Это позволило бы использовать несколько видов полезных шаблонов. Здесь вы можете найти здесь здесь и . .
Тем временем для некоторых случаев вы можете использовать
std::mem::replace
иstd::mem::swap
. Эти функции позволяют «взять» значение из изменяемой ссылки, если вы дадите что-то взамен.