Пока ваш метод foo()
принимает &self
, это невозможно, поскольку сигнатура
pub fn third_party(data: Vec<i32>) -> i32
однозначна: независимо от того, что делает эта функция third_party
, ее состояния API что ему нужен собственный экземпляр Vec
, по значению. Это исключает использование заимствования в любой форме, и поскольку foo()
принимает self
по ссылке, вы ничего не можете сделать, кроме клонирования.
Кроме того, предположительно, этот third_party
написан без каких-либо странных небезопасных хаки, так что вполне безопасно предположить, что Vec
, который передается в него, в конечном итоге отбрасывается и освобождается. Поэтому небезопасное создание копии оригинального Vec
без ее клонирования (путем копирования внутренних указателей) не подлежит сомнению - если вы это сделаете, вы обязательно получите беспошлинное использование.
Пока ваш вопрос не гласит, тот факт, что вы хотите сохранить первоначальное значение data
, является своего рода естественным предположением. Если это предположение можно ослабить, и вы на самом деле согласны выдать экземпляр data
и, например, заменить его пустым вектором внутри, тогда есть несколько вещей, которые вы потенциально можете сделать:
- Переключите
foo(&self)
на foo(&mut self)
, тогда вы можете легко извлечь data
и заменить его пустым вектором. - Используйте
Cell
или RefCell
для хранения данных. Таким образом, вы можете продолжать использовать foo(&self)
за счет некоторых проверок во время выполнения, когда вы извлекаете значение из ячейки и заменяете его некоторым значением по умолчанию.
Однако оба эти подхода , вы потеряете оригинал Vec
. С данным сторонним API нет никакого способа обойти это.
Если вы все еще можете каким-то образом влиять на этот внешний API, то лучшим решением было бы изменить его, чтобы он принимал &[i32]
, который может быть легко получен от Vec<i32>
с заимствованием.