相关疑难解决方法(0)

在Rust 1.3中继承结构的最佳方法是什么?

当我使用Rust 1.3编译它时,编译器告诉我virtual结构已从语言中删除:

struct Foo: Bar {

}
Run Code Online (Sandbox Code Playgroud)

inheritance struct rust

21
推荐指数
1
解决办法
1万
查看次数

如何将一个结构转换为另一个具有完全相同字段名称和类型的结构?

我有两个具有相同名称、字段(和字段类型)的相同结构,它们位于不同的模块中。它们是由派生宏构造的,并且希望轻松地从一种转换为另一种。

例如

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()。有没有办法在没有所有相关样板的情况下实现这一目标?

struct type-conversion rust

6
推荐指数
1
解决办法
7168
查看次数

如何在 Rust 中为相似但不同的类型重用代码?

我有一个具有一些功能的基本类型,包括特征实现:

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)

这是一个简化的例子,真正的代码会更复杂。

我想介绍两种类型,它们具有与我描述的基本类型相同的字段和行为,例如MyUserIdentifierMyGroupIdentifier。为避免在使用这些时出错,编译器应将它们视为不同的类型。

我不想复制我刚写的整个代码,我想重用它。对于面向对象的语言,我会使用继承。我将如何为 Rust 做到这一点?

code-reuse types rust

3
推荐指数
1
解决办法
327
查看次数

如何在 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 似乎无法做到这一点,但它需要完成,我需要一个解决方法:

  1. 允许贵宾犬和罗威纳犬使用该品种不需要考虑的完全相同的行为吠叫。
  2. 无需在每个品种模块中重新编码 bark() 就可以实现这一点,这是编程地狱,因为它会导致重复的代码,并且每个模块都必须实现 bark()。
  3. Traits 是相反的,不能访问结构体,因此 default-trait 实现不起作用。Rust 不支持类似 OOP 的继承,这里也不需要它。

因此,我问:既然贵宾犬和罗威纳犬的吠叫方式完全相同,那么如何在不重写每个模块中的 bark() 的情况下实现 bark() …

paradigms shared functional-programming behavior rust

2
推荐指数
1
解决办法
143
查看次数