根据类型注解返回不同类型值的Rust函数

3

我希望有一个能够根据类型注解返回不同类型值的函数,例如:

give_five::<String>(); // returns "five"
give_five::<i32>(); // returns 5
give_five::<f32>(); // return 5.0

我尝试着写,但是它不起作用。我知道为什么它不起作用,但我不知道如何做。

fn give_five<String>() -> String {
    String::from("five")
}
fn give_five<i32>() -> i32 {
    5
}
fn give_five<f32>() -> f32 {
    5.0
}

我从rand crate中得到了灵感。因为它可以做到......
let mut rng = rand::thread_rng();
let x: i32 = rng.gen();
let y: f32 = rng.gen();
1个回答

7

通过定义一个trait来实现:

trait GiveFive {
    fn give_five() -> Self;
}

并为您想要的类型实现它:

impl GiveFive for &'static str {
    fn give_five() -> &'static str {
        return "five";
    }
}

impl GiveFive for i32 {
    fn give_five() -> i32 {
        return 5;
    }
}

impl GiveFive for f32 {
    fn give_five() -> f32 {
        return 5.0;
    }
}

然后来使用它:

fn main() {
    let x: &str = GiveFive::give_five(); // returns "five"
    let y: i32 = GiveFive::give_five(); // returns 5
    let z: f32 = GiveFive::give_five(); // return 5.0
}

或者

fn main() {
    let x = <&str>::give_five(); // returns "five"
    let y = i32::give_five(); // returns 5
    let z = f32::give_five(); // return 5.0
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接