サーチ…


宣言

// 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特性によって行われます。これは入力と出力のパラメータを持っています。 where T: std::ops::Add<u32,Output=U>は、 Tu32Addすることが可能であり、この加算は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は、unsized型も許可します。

汎用関数

汎用関数は、引数の一部または全部をパラメータ化できるようにします。

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