Интерфейс и несколько реализаций
От:
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: Интерфейс и несколько реализаций
Здравствуйте, 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&mode=debug&edition=2021&gist=b9b4006945a68782202ecb71de396aa3
Re[2]: Интерфейс и несколько реализаций
От:
vaa
Дата: 14.11.22 09:35
Оценка:
Здравствуйте, johny5, Вы писали:
J>Помоему идёт речь о trait?
Немного не то, тут получается отдельная структура, а как в структуру положить функцию(как поле)?
J>https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=b9b4006945a68782202ecb71de396aa3
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[3]: Интерфейс и несколько реализаций
Здравствуйте, 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();
}
Можно и не объявлять трейт, а тоже использовать функцию.
Re[4]: Интерфейс и несколько реализаций
От:
vaa
Дата: 14.11.22 11:55
Оценка:
Здравствуйте, DarkEld3r, Вы писали:
DE>Здравствуйте, vaa, Вы писали:
vaa>>Немного не то, тут получается отдельная структура, а как в структуру положить функцию(как поле)?
DE>Не знаю F#, поэтому не уверен, что правильно понял фрагмент кода, но положить "интерфейс" в структуру в расте можно. Или как дженерик или как трейт-объект:
Именно, спасибо!
DE>Можно и не объявлять трейт, а тоже использовать функцию.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить