Как изменить мой код для работы с разными типами?

Мой блок 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 03.09.2024 10:28

@zerocukor287, покажи правильный путь в качестве ответа?

Alex 03.09.2024 10:31

Итак, вы хотите напечатать Dom и вернуть квадрат Num?

FZs 03.09.2024 10:33

@FZs, да. но хотелось бы еще такой вариант для понимания: вернуть Дом (для действий без печати) и вернуть квадрат. Спасибо

Alex 03.09.2024 10:38

Кажется, вы не понимаете разницу между возвратом значения и его печатью. f01 только печатает значение, но не возвращает его.

interjay 03.09.2024 10:39

@interjay, значит вернется: fn f01(&self) -> String {} и fn f01(&self) -> u8 {} но ты прав, навыков нет. Спасибо

Alex 03.09.2024 10:43
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
0
6
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Думаю, вам стоит использовать здесь Связанные типы.

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
}

круто .. спасибо.

Alex 03.09.2024 11:08

Другие вопросы по теме