2016-12-15 2 views
1

Могу ли я использовать изменяемый ссылочный метод, как передающий значение? Например, можно использоватьМогу ли я использовать изменяемый ссылочный метод, как передающий значение?

o.mth(&mut self, ...) 

в

o.mth(self, ...) 

Это позволит мне возвращать результат, не заботясь о жизни o. Это может быть закрытие move или какой-то оберткой?

Для контекста я пытаюсь вернуть коробчатый итератор по CSV-записям, используя пакет ржавчины-csv, но итератор не может пережить читателя, который Reader::records(&'t mut self) усматривает зависание. Сравните это с BufRead::lines(self), который потребляет его читатель и, следовательно, может быть возвращен без проблем с продолжительностью жизни.

+1

http://www.stackoverflow.com/q/36645452/155423, http://stackoverflow.com/q/30488928/155423, http://stackoverflow.com/q/38797960/155423 - по какой-либо причине , каждый хочет вернуть CSV-итератор. – Shepmaster

+0

Поскольку элементы итератора не заняты, похоже, что итератор записей можно переделать, чтобы получить значение «R: Read». Поскольку '& mut R' реализует' Read where R: Read', он охватывает оба случая. – bluss

+0

@bluss Да, я был удивлен этим. Я предположил, что они будут струнными срезами. Однако такое изменение по-прежнему будет нарушением API-интерфейса, но не к тому, к чему страшно приспособиться. – Shepmaster

ответ

2

Нет, вы не можете. Причина, по которой существуют методы self, &self и &mut self, заключается в том, что они ведут себя по-разному, имеют разные ограничения и допускают разные вещи.

В этом случае вы, вероятно, в конечном итоге попробуете to create an iterator that yields references to itself, что недопустимо, или store a value and a reference to that value in the same struct, что также запрещено.