Rust
Дженерики
Поиск…
декларация
// Generic types are declared using the <T> annotation
struct GenericType<T> {
pub item: T
}
enum QualityChecked<T> {
Excellent(T),
Good(T),
// enum fields can be generics too
Mediocre { product: T }
}
Конкретизация
// explicit type declaration
let some_value: Option<u32> = Some(13);
// implicit type declaration
let some_other_value = Some(66);
Множественные параметры типа
Типы обобщений могут иметь более одного типа параметров, например. Result
определяется следующим образом:
pub enum Result<T, E> {
Ok(T),
Err(E),
}
Ограниченные общие типы
// Only accept T and U generic types that also implement Debug
fn print_objects<T: Debug, U: Debug>(a: T, b: U) {
println!("A: {:?} B: {:?}", a, b);
}
print_objects(13, 44);
// or annotated explicitly
print_objects::<usize, u16>(13, 44);
Оценки должны охватывать все виды использования этого типа. Добавление выполняется с помощью std::ops::Add
trait, которая имеет входные и выходные параметры. where T: std::ops::Add<u32,Output=U>
заявляет, что возможно Add
T
в u32
, и это дополнение должно произвести тип U
fn try_add_one<T, U>(input_value: T) -> Result<U, String>
where T: std::ops::Add<u32,Output=U>
{
return Ok(input_value + 1);
}
По умолчанию подразумевается Sized
граница. ?Sized
bound также позволяет использовать нестандартные типы.
Общие функции
Общие функции позволяют параметризировать некоторые или все их аргументы.
fn convert_values<T, U>(input_value: T) -> Result<U, String> {
// Try and convert the value.
// Actual code will require bounds on the types T, U to be able to do something with them.
}
Если компилятор не может вывести параметр типа, он может быть предоставлен вручную по вызову:
let result: Result<u32, String> = convert_value::<f64, u32>(13.5);
Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow