我想用many种方法列出一个性状:

pub trait DataSetT{
    fn numeric_op_1(&self){...};
    fn numeric_op_2(&self)->f64{...};
    ...
    fn io_op_1(&self) {..};
    fn io_op_2(&self) -> DataFrame {...};
    ...
}

现在,如果我在同一个文件中定义所有这些方法,它将变得非常庞大. 为了代码的整洁和可视,我希望是split these definitions across different files/modules.

例如,数字运算符将位于: src/numerics.rs个 和IO的运作将生活在 src/io.rs

对于implementing,Struct的这一特性也是如此(覆盖默认特性行为).

一旦我试着这样做,我要么得到not all trait items implemented分,要么得到confilicting definitions分.

在这种情况下,最佳实践解决方案是什么?

推荐答案

如果没有宏,您应该不能将特征定义拆分到不同的模块.在你写trait MyTrait { .. }的地方,你需要定义它.

但你可以定义多个特征,并拥有一个超级特征,就像这样:

// src/ops/a.rs
pub trait OpA {
    fn op_a1(&self);
    fn op_a2(&self) -> f64;
}

// src/ops/b.rs
pub trait OpB {
    fn op_b1(&self);
    fn op_b2(&self);
}

// src/ops/mod.rs
pub trait Op: OpA + OpB {}

// src/ops_impl/mod.rs
struct MyOp {}

impl Op for MyOp {}

// src/ops_impl/a.rs
impl OpA for MyOp {
    fn op_a1(&self) {}
    fn op_a2(&self) -> f64 {
        42.0
    }
}

// src/ops_impl/b.rs
impl OpB for MyOp {
    fn op_b1(&self) {}
    fn op_b2(&self) {}
}

Rust相关问答推荐

Rust为什么应用于引用的操作符可以强制,而具有显式类型的let则不能?

使用nom将任何空白、制表符、白线等序列替换为单个空白

如何在rust中有条件地分配变量?

为什么我们不能通过指针算法将Rust原始指针指向任意地址?'

包含嵌套 struct 的CSV

展开枚举变量并返回所属值或引用

为什么reqwest以文本形式下载二进制文件?

默认特征实现中的生命周期问题

在自定义序列化程序中复制serde(With)的行为

无法从流中读取Redis请求

Tokio';s io::用Cursor拆分<;Vec<;u8>>;赢得';t get the full writted data

如何迭代存储在 struct 中的字符串向量而不移动它们?

Rust中的位移操作对范围有什么影响?

是否可以通过可变引用推进可变切片?

Rust 中的自动取消引用是如何工作的?

std::vector::shrink_to_fit 如何在 Rust 中工作?

使用 traits 时,borrow 的值不会存在足够长的时间

如何在 Rust 中返回通用 struct

有没有办法在 Rust 中对 BigInt 进行正确的位移?

你能用 Rust 和 winapi 制作 Windows 桌面应用程序吗?