Я новичок в Rust. Я не знаю, как преобразовать общий тип <T> в примитивный тип.

Вот крошечный пример функции sum с универсальными типами:

fn sum<T: std::ops::Add<Output = T>, U>(x:T, y: U) -> T {
    // is there any line of code similar to:
    // x + y as T
    
    x + y as T
    
    // or check the type
    // match type(x) {
    //    i32 => x + y as i32,
    //    i64 => x + y as i64,
    //    f32 => x + y as f32,
    //    _ => 0
    // }
}

fn main() {
    let a = 1;
    let b = 22.22;
    println!("{}", sum(a, b));
    
    let a = 11.11;
    let b = 2;
    println!("{}", sum(a, b));
}
0
tres.14159 21 Фев 2021 в 23:24

1 ответ

Лучший ответ

Первоначальная мысль могла заключаться в том, чтобы потребовать U: {{X1} }. Однако нет, например, impl Into<i32> for f32, так что это не сработает. Можно также подумать о том, чтобы потребовать T: Add<U, Output = T> < / a>, однако в вашем случае это не сработает по той же причине.

Вместо этого вы можете использовать num ящик, в частности AsPrimitive характеристика.

use std::ops::Add;

// num = "0.3"
use num::cast::AsPrimitive;

fn sum<T, U>(x: T, y: U) -> T
where
    T: Copy + 'static,
    T: Add<Output = T>,
    U: AsPrimitive<T>,
{
    x + y.as_()
}

В этой реализации sum() при выполнении вашего main() будет выведено следующее:

23
13.11
3
vallentin 21 Фев 2021 в 20:47