Параметр функции различных целочисленных типов в Rust - PullRequest
0 голосов
/ 13 марта 2020

Как бы я сделал следующее, если бы Rust поддерживал две percent функции?

fn percent(x: u8) -> f32 {
    x as f32 / 100.0
}
fn percent(x: u16) -> f32 {
    x as f32 / 100.0
}

Если я попробую тип данных c generic, как показано ниже:

fn percent<T>(x: T) -> f32 {
    x as f32 / 100.0
}

Я получаю ошибку

не примитивное приведение: T as f32

Могу ли я ограничить T какой-либо целочисленной чертой?

1 Ответ

1 голос
/ 13 марта 2020

Если вы хотите поддерживать только типы u8 и u16, то достаточно:

fn percent<T: Into<f32>>(x: T) -> f32 {
    x.into() / 100.0
}

, поскольку и u8, и u16 можно без потерь преобразовать в f32 , Если вы хотите произвести общее преобразование, скажем, от u64 до f64, где может произойти потеря точности, вы можете использовать черту ApproxInto из conv.

fn percent<T: ApproxInto<f64>>(x: T) -> Result<f64, T::Err> {
    x.approx_into().map(|v| v / 100.0)
}
...