Я пытаюсь использовать структуру с несколькими реализациями одного метода:
trait Trait { fn apply(&self) -> vec<usize>; }
struct Bar<X> { vec: Vec<usize> }
impl<X> Bar<X> {
pub fn new(vec: Vec<usize>) -> Self { Self{vec} }
pub fn test(&self) {
// Things here
println!("Method: {:?}", self.apply());
// Things there
}
}
impl Trait for Bar<ThisWay> {
fn apply(&self) -> Vec<usize> { self.vec.iter().map(|x| x.pow(2)).collect() }
}
impl Trait for Bar<ThatWay> {
fn apply(&self) -> Vec<usize> { self.vec.iter().map(|x| x + 2).collect() }
}
fn main() {
Bar<ThisWay>::new(vec![1,2,3]).test();
Bar<ThatWay>::new(vec![1,2,3]).test();
}
Что вернется:
>>> [1,4,9];
>>> [3,4,5];
Я знаю, что могу создать две структуры, реализующие эти методы по-разному, но это неправильно, поскольку потенциально это много избыточного кода. Я также знаю, что мог бы иметь ссылку на этот метод реализации:
trait Trait { fn apply(vec: &Vec<usize>) -> Vec<usize>; }
impl Struct{
// fn new
test(&self, t: &impl Trait) {
// Things here
println!("{:?}", t::apply(&self.vec));
// Things there
}
}
struct ThisWay;
struct ThatWay;
impl Trait for ThisWay {fn apply(vec: &Vec<usize>) -> Vec<usize> {///} };
impl Trait for ThatWay {fn apply(vec: &Vec<usize>) -> Vec<usize> {///} };
fn main() {
let this_way = ThisWay{};
let that_way = ThatWay{};
let problem = Bar::new(vec![1,2,3]);
problem.test(&this_way);
problem.test(&that_way);
}
Этот подход кажется излишне сложным, когда я хочу использовать множество аргументов внутри данной структуры:
fn hill_climber(&self, nullary_op: &impl NullaryOperator, unary_op: &impl UnaryOperator, ...) {
self.vec = nullary_op();
self.vec = unary_op(&self.vec, self.n, self.m, self.jobs, self.stuff, ...);
}
Похоже, это проклятый способ написания кода. Что происходит, когда реализация метода не использует параметр, например m
, а другие его используют?
Trait
для чего-нибудь, кромеBar<X>
? Если нет, просто реализуйте его дляX
и заставьтеapply()
принимать&Bar
вместо&self
. - person Sven Marnach   schedule 04.11.2020