相关疑难解决方法(0)

如何避免具有语义相等的字段/属性的不同结构的代码重复?

鉴于以下两个结构:

pub struct RectangleRenderer {
    canvas: Canvas,
    origin: Point,
    shape: Rectangle,
}

pub struct CircleRenderer {
    canvas: Canvas,
    center: Point,
    shape: Circle,
}
Run Code Online (Sandbox Code Playgroud)

由于我来自爪哇,我会从中提取基类ShapeRenderer淘汰者和应用领域canvas,并origin到,虽然具体类型将继续把他们的领域shape。在这种情况下,Rust的最佳实践是什么,因为特征仅起到类似于界面的作用,因此不允许属性/字段?

inheritance struct code-duplication rust

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

如何在 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
查看次数