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 как правило, предпочитают делать как можно больше во время компиляции, так как он склонен отлавливать ошибки раньше.