Home > Mobile >  Is there a way to split Trait implementation and defenition across different modules?
Is there a way to split Trait implementation and defenition across different modules?

Time:08-09

I'd like to define a trait with many methods:

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 {...};
    ...
}

Now, if I define all these methods in the same file it would get humongous. For the sake of clean and visibile code, I'd like to split these definitions across different files/modules.

For example numeric operatins would live in: src/numerics.rs And io operations would live in src/io.rs

Same thing with implementing this trait for a Struct (overriding the default trait behaviour).

As soon as I try doing that, I either get not all trait items implemented or confilicting definitions.

What is the best practice solution in this kind of situtation?

CodePudding user response:

Without macro you should not be able to split a trait definition over different modules. Where you write trait MyTrait { .. } you need to define it.

But you can define multiple traits and have a super trait, like this:

// 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) {}
}

  • Related