Функция Rust, которая возвращает разные значения в зависимости от типа аннотации - PullRequest
1 голос
/ 23 января 2020

Я хочу иметь функцию, которая возвращает различный тип значения в зависимости от типа аннотации, что-то вроде:

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 ящика. Так как это может сделать

let mut rng = rand::thread_rng();
let x: i32 = rng.gen();
let y: f32 = rng.gen();

1 Ответ

4 голосов
/ 23 января 2020

Это делается путем определения черты:

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...