当我使用Rust 1.3编译它时,编译器告诉我virtual结构已从语言中删除:
struct Foo: Bar {
}
Run Code Online (Sandbox Code Playgroud) 我有两个具有相同名称、字段(和字段类型)的相同结构,它们位于不同的模块中。它们是由派生宏构造的,并且希望轻松地从一种转换为另一种。
例如
mod a {
struct A {
field1: String,
field2: String,
}
}
mod b {
struct A {
field1: String,
field2: String,
}
}
Run Code Online (Sandbox Code Playgroud)
我希望能够做let a: a::A = a::A::from(b::A)或类似的事情。
impl From<b::A> for a::A需要在方法中写入两个结构体的所有字段from()。有没有办法在没有所有相关样板的情况下实现这一目标?
我有一个具有一些功能的基本类型,包括特征实现:
use std::fmt;
use std::str::FromStr;
pub struct MyIdentifier {
value: String,
}
impl fmt::Display for MyIdentifier {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.value)
}
}
impl FromStr for MyIdentifier {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(MyIdentifier {
value: s.to_string(),
})
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个简化的例子,真正的代码会更复杂。
我想介绍两种类型,它们具有与我描述的基本类型相同的字段和行为,例如MyUserIdentifier和MyGroupIdentifier。为避免在使用这些时出错,编译器应将它们视为不同的类型。
我不想复制我刚写的整个代码,我想重用它。对于面向对象的语言,我会使用继承。我将如何为 Rust 做到这一点?
对于编写一个非常大的程序,我认为没有办法减轻必须为每个使用某种共享行为的结构编写相同的代码。
例如,Dog 可能会“吠叫”:
struct Dog {
is_barking: bool,
....
}
impl Dog {
pub fn bark(self) {
self.is_barking = true;
emit_sound("b");
emit_sound("a");
emit_sound("r");
emit_sound("k");
self.is_barking = false;
}
....
}
Run Code Online (Sandbox Code Playgroud)
这种狗的许多品种可能存在:
struct Poodle {
unique_poodle_val: &str
}
impl Poodle {
pub fn unique_behaviour(self) {
self.some_behaviour();
}
}
struct Rottweiler {
unique_rottweiler_val: u32
}
impl Rottweiler{
pub fn unique_behaviour(self) {
self.some_behaviour();
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,以我目前的知识来看,Rust 似乎无法做到这一点,但它需要完成,我需要一个解决方法:
因此,我问:既然贵宾犬和罗威纳犬的吠叫方式完全相同,那么如何在不重写每个模块中的 bark() 的情况下实现 bark() …