Я пытаюсь создать универсальный интерфейс метода, который принимает несколько типов ссылок и пытается сохранить клон, если это возможно.У меня есть две проблемы:
- Есть много черт в ссылках и тому подобное, но я не уверен, как их применять, чтобы вы могли сказать btwn value, mut value, ref, mut refв одной универсальной функции.
- Есть ли передовая практика для клонирования, если это необходимо?Я играл с Cow, From / Into, ToOwned, AsRef, Deref и другими, но я просто не могу найти разумный способ сделать это.
У Коровы есть идея, чего я хочу, но если я выставлю Cow на входе, я не смогу использовать Cow :: from без его реализации, и Cow :: Owned / Borrowed побеждает большую часть цели.И я не могу понять, не разоблачая мнение Коровы.From / Into почти идеален, но я не могу заставить дженерики работать.Я также попытался разделить функции на отдельные черты и реализовать, но компилятор не может выбирать между ними.
Ниже приведена базовая демонстрация.У меня также есть контроль над интерфейсом Bar, если это необходимо для получения достойного интерфейса, но я был бы удивлен, если бы не было простого способа по существу усовершенствовать передачу аргументов.
Как Rust предоставляет семантику перемещения? похож, но не решил проблему.
struct Foo {
x: i32
}
impl Foo {
// Move bar in; no clone, return original
pub fn add<T: Bar>(&self, mut bar: T) -> T {
bar.plus(self.x);
bar
}
// bar immutable or reference; clone and return
pub fn add<T: Bar>(&self, bar: T | &T | &mut T) -> T {
let mut newbar = bar.clone();
newbar.plus(self.x);
newbar
}
}