Rust идиома для "клон, если неизменный или ref" - PullRequest
1 голос
/ 01 мая 2019

Я пытаюсь создать универсальный интерфейс метода, который принимает несколько типов ссылок и пытается сохранить клон, если это возможно.У меня есть две проблемы:

  1. Есть много черт в ссылках и тому подобное, но я не уверен, как их применять, чтобы вы могли сказать btwn value, mut value, ref, mut refв одной универсальной функции.
  2. Есть ли передовая практика для клонирования, если это необходимо?Я играл с 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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...