I have lib.rs:
pub mod genetics {
use std;
pub trait RandNewable {
fn new() -> Self;
}
pub trait Gene : std::fmt::Debug + Copy + Clone + RandNewable {}
#[derive(Debug, Copy, Clone)]
pub struct TraderGene {
cheat: bool,
}
impl RandNewable for TraderGene {
fn new() -> TraderGene {
TraderGene {
cheat: true,
}
}
}
#[derive(Debug)]
pub struct DNA<G: Gene> {
genes: [G; 3],
}
impl <G: Gene> DNA<G> {
pub fn create() -> DNA<G> {
DNA {
genes: [RandNewable::new(), RandNewable::new(), RandNewable::new()],
}
}
pub fn mutate(&self) -> DNA<G> {
let mut copy = self.genes;
copy[0] = RandNewable::new();
DNA {
genes: copy,
}
}
}
}
and I'm trying to use the definitions in main.rs:
extern crate trafficgame;
use trafficgame::genetics::{DNA, TraderGene, Gene, RandNewable};
fn main() {
let t1: DNA<TraderGene> = DNA::create();
let t2 = t1.mutate();
}
but I'm getting two errors:
the trait `trafficgame::genetics::Gene` is not implemented for the type `trafficgame::genetics::TraderGene
and
type `trafficgame::genetics::DNA<trafficgame::genetics::TraderGene>` does not implement any method in scope named `mutate`
TraderGene
definitely implements the Gene
trait, but it seems like the impl for RandNewable
isn't in scope in main. The other problem is that since mutate isn't declared in a trait, I don't know what to import in main in order to reference mutate. Am I organizing things incorrectly?
Even though your
Gene
trait has no methods,TraderGene
will not automatically implement it, even if it implements all ofGene
's supertraits. You must write an emptyimpl
in yourgenetics
module: