Как проверить тип параметра функции? - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть функция:

fn my_function(my_float:f32) -> f32{
     my_float - 1.55
}

С помощью этой функции, если я передаю целое число (конечно), я получаю ошибку:

expected type f32 found type {integer}

Я хотел бы знать, если есть способ обработки ошибки изнутри функции (или любым другим способом), например, если пользователь передает строку, целое число или другой тип.

1 Ответ

4 голосов
/ 24 апреля 2020

Rust - это статически типизированный, скомпилированный язык. Таким образом, он фиксирует типы каждой функции во время компиляции. То есть, как правило, вы решаете, какие типы принимает ваша функция.

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

fn doit<T>(t: T) {...}

Таким образом, вы можете передать разные вещи для doit, но вы все равно должны решить во время компиляции.

Теперь есть возможность передавать разные вещи в функцию во время выполнения.

Одной из возможностей может быть создание enum:

enum MyType {
    F32(f32),
    Str(String),
    USize(usize),
}

Тогда ваша функция может принять параметр MyType и решить, что делать. Этот подход требует, чтобы вы указали заранее (т.е. во время компиляции), какие типы вы хотите разрешить для своей функции.

Другой подход во время выполнения может включать Any:

fn doit(t: &dyn std::any::Any) {
    match t.downcast_ref::<usize>() {
        Some(u) => println!("its usize: {}", u),
        None => println!("not usize"),
    }
}

fn main() {
    doit(&2usize);
    doit(&("sdf".to_string()));
}

I как правило, предпочитают делать как можно больше во время компиляции, так как он склонен отлавливать ошибки раньше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...