Может ли признак дать реализацию по умолчанию для метода признака, от которого он наследуется? - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть черта с несколькими методами.Некоторые, но не все структуры, которые реализуют эту черту, имеют одинаковую реализацию одного из методов:

trait Blabla {
    fn xy(self, x: u32, y: u32) -> u32;
}

// ---------------------------------
struct Ding {}

impl Blabla for Ding {
    fn xy(self, x: u32, y: u32) -> u32 {
        x + y
    }
}

// ---------------------------------
struct Dong {
    dong_attribute: u32,
}

impl Dong {
    fn get_1(self) -> u32 {
        1
    }
}

impl Blabla for Dong {
    fn xy(self, x: u32, y: u32) -> u32 {
        x + y + self.get_1()
    }
}

// ---------------------------------
struct Dung {
    dung_attribute: f32,
}

impl Dung {
    fn get_1(self) -> u32 {
        1
    }
}

impl Blabla for Dung {
    fn xy(self, x: u32, y: u32) -> u32 {
        x + y + self.get_1()
    }
}

В этом примере есть три структуры, каждая из которых реализует черту Blabla, и две из которыхРеализация метода xy точно таким же образом.

Есть ли способ заставить их поделиться кодом для этой функции?

Я думал о второй черте, которая наследуется от Blablaи укажите xy в качестве реализации этой черты по умолчанию, например:

trait Blabla {
    fn xy(self, x: u32, y: u32) -> u32;
}

// ----------------------------------
trait Blubblub: Blabla {
    fn get_1(self) -> u32;
    fn xy(self, x: u32, y: u32) -> u32 {
        x + y + self.get_1()
    }
}

// ---------------------------------
struct Ding {}

impl Blabla for Ding {
    fn xy(self, x: u32, y: u32) -> u32 {
        x + y
    }
}

// ---------------------------------
struct Dong {
    dong_attribute: u32,
}

impl Blubblub for Dong {
    fn get_1(self) -> u32 {
        1
    }
}

// ---------------------------------
struct Dung {
    dung_attribute: f32,
}

impl Blubblub for Dung {
    fn get_1(self) -> u32 {
        1
    }
}

fn main() {
    let x = Dung {
        dung_attribute: 1.0,
    };
    println!{"{}", x.xy(1,1)};
}

Это не работает, потому что наследование черт в Rust означает, что обе черты должны быть реализованы, и, следовательно, это не такизбавь меня от ввода того же кода в реализации Blabla::xy для Dong и Dung.

1 Ответ

0 голосов
/ 20 сентября 2018

Реализация Blabla с реализацией по умолчанию для всех Blubblub, и ваш пример работает:

trait Blubblub: Blabla {
    fn get_1(self) -> u32;
}

impl<T: Blubblub> Blabla for T {
    fn xy(self, x: u32, y: u32) -> u32 {
        x + y + self.get_1()
    }
}
...