Интерфейс и несколько реализаций
От: vaa  
Дата: 14.11.22 07:50
Оценка:
В F# есть такая возможность, определить типа наподобие интерфейса и указывать различные реализации
type Db<'a> = { Save : 'a -> unit } // <=!!!
let mock = { Db.Save = fun (x:string) -> printfn $"{x} is saved" } 
mock.Save "ok"

Пробовал аналогично определить поле в структуре раста, но не получается.
Принципиально не возможно? Как тогда гибко менять реализации в расте?
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Интерфейс и несколько реализаций
От: johny5 Новая Зеландия
Дата: 14.11.22 09:16
Оценка: 10 (1)
Здравствуйте, vaa, Вы писали:

vaa>В F# есть такая возможность, определить типа наподобие интерфейса и указывать различные реализации

vaa>
vaa>type Db<'a> = { Save : 'a -> unit } // <=!!!
vaa>let mock = { Db.Save = fun (x:string) -> printfn $"{x} is saved" } 
vaa>mock.Save "ok"
vaa>

vaa>Пробовал аналогично определить поле в структуре раста, но не получается.
vaa>Принципиально не возможно? Как тогда гибко менять реализации в расте?

Помоему идёт речь о trait?

trait Db {
  fn save(&self, x : &str);
}

fn use_trait<T : Db>(val : &T)
{
  val.save("value");
}

struct Mock {
}

impl Db for Mock {
  fn save(&self, val  :&str) {
    println!("{val} is saved");
  }
}

fn main() {
  let mock = Mock {};
  use_trait(&mock);
}


https://play.rust-lang.org/?version=stable&amp;mode=debug&amp;edition=2021&amp;gist=b9b4006945a68782202ecb71de396aa3
Re[2]: Интерфейс и несколько реализаций
От: vaa  
Дата: 14.11.22 09:35
Оценка:
Здравствуйте, johny5, Вы писали:

J>Помоему идёт речь о trait?


Немного не то, тут получается отдельная структура, а как в структуру положить функцию(как поле)?

J>https://play.rust-lang.org/?version=stable&amp;mode=debug&amp;edition=2021&amp;gist=b9b4006945a68782202ecb71de396aa3
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[3]: Интерфейс и несколько реализаций
От: DarkEld3r  
Дата: 14.11.22 10:34
Оценка: 34 (2) +1
Здравствуйте, vaa, Вы писали:

vaa>Немного не то, тут получается отдельная структура, а как в структуру положить функцию(как поле)?


Не знаю F#, поэтому не уверен, что правильно понял фрагмент кода, но положить "интерфейс" в структуру в расте можно. Или как дженерик или как трейт-объект:
trait Save {
    fn save(&self);
}

struct Db1<T: Save> {
    save: T,
}

struct Db2 {
    save: Box<dyn Save>,
}

struct SomeSaveImpl {}

impl Save for SomeSaveImpl {
    fn save(&self) {
        println!("save");
    }
}

fn main() {
    let db1 = Db1 {
        save: SomeSaveImpl {},
    };
    db1.save.save();

    let db2 = Db2 {
        save: Box::new(SomeSaveImpl {}),
    };
    db2.save.save();
}

Можно и не объявлять трейт, а тоже использовать функцию.
Отредактировано 14.11.2022 10:34 DarkEld3r . Предыдущая версия .
Re[4]: Интерфейс и несколько реализаций
От: vaa  
Дата: 14.11.22 11:55
Оценка:
Здравствуйте, DarkEld3r, Вы писали:

DE>Здравствуйте, vaa, Вы писали:


vaa>>Немного не то, тут получается отдельная структура, а как в структуру положить функцию(как поле)?


DE>Не знаю F#, поэтому не уверен, что правильно понял фрагмент кода, но положить "интерфейс" в структуру в расте можно. Или как дженерик или как трейт-объект:


Именно, спасибо!

DE>Можно и не объявлять трейт, а тоже использовать функцию.
☭ ✊ В мире нет ничего, кроме движущейся материи.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.