수색…


선언

// 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 할 수 있음을 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);
}

SizedSized 바운드는 기본적으로 암시됩니다. ?Sized 지정된 바운드는 크기가없는 유형도 허용합니다.

일반 함수

일반 함수는 매개 변수의 일부 또는 전체를 매개 변수화 할 수 있습니다.

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.
}

컴파일러가 type 매개 변수를 유추 할 수없는 경우 호출시 수동으로 제공 할 수 있습니다.

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