Мой блок 1 работает, и я получаю: «abc» и 49.
Как изменить мой код, чтобы блок 2 работал вместо блока 1?
Я не могу изменить его на fn f01(&self) -> ;
для работы.
Mylink
struct Dom {a: String,}
struct Num {a: u8,}
trait Trt {
fn f01(&self);
}
impl Trt for Dom {
fn f01(&self) {
println!("{:?}", &self.a);
}
}
impl Trt for Num {
fn f01(&self) {
println!("{:?}", &self.a * &self.a);
}
}
fn main() {
let dom = Dom {a: "abc".to_string()};
let num = Num {a: 7};
// Block 1:
Trt::f01(&dom); // "abc"
Trt::f01(&num); // 49
// Block 2:
// Trt::f01(&dom); // "abc"
// let b: u8 = Trt::f01(&num) + 1;
// println!("{:?}", b); // 50
}
@zerocukor287, покажи правильный путь в качестве ответа?
Итак, вы хотите напечатать Dom
и вернуть квадрат Num
?
@FZs, да. но хотелось бы еще такой вариант для понимания: вернуть Дом (для действий без печати) и вернуть квадрат. Спасибо
Кажется, вы не понимаете разницу между возвратом значения и его печатью. f01
только печатает значение, но не возвращает его.
@interjay, значит вернется: fn f01(&self) -> String {}
и fn f01(&self) -> u8 {}
но ты прав, навыков нет. Спасибо
Думаю, вам стоит использовать здесь Связанные типы.
struct Dom {
a: String,
}
struct Num {
a: u8,
}
trait Trt {
// This trait also have a assoiated type
type OutputF01;
// We define that the function f01 will return Self::OutputF01
fn f01(&self) -> Self::OutputF01;
}
impl Trt for Dom {
// For Dom we return nothing
type OutputF01 = ();
fn f01(&self) -> Self::OutputF01 {
// just a print statement and no return
println!("{:?}", self.a);
}
}
impl Trt for Num {
// For Num we will return an u8
type OutputF01 = u8;
fn f01(&self) -> Self::OutputF01 {
// return the square of self.a
self.a * self.a
}
}
fn main() {
let dom = Dom {
a: "abc".to_string(),
};
let num = Num { a: 7 };
Trt::f01(&dom); // "abc"
let b: u8 = Trt::f01(&num) + 1;
println!("{:?}", b); // 50
}
круто .. спасибо.
Вы ищете дженерики ?