簡體   English   中英

如何在 Rust 中調用通用 trait 方法

[英]How to call generic trait method in Rust

擁有這些相當人為的類型定義

trait Generic<T> {
    fn some(&self) -> T;
}

impl<T> Generic<T> for i32
where
    T: Default,
{
    fn some(&self) -> T {
        T::default()
    }
}

我想調用some明確指定類型 T 的方法。下面的代碼顯然不起作用,因為該方法本身不是通用的。

fn main() {
    let int: i32 = 45;
    println!( "some: {}", int.some<bool>() );
}

調用some的正確方法是什么?

正如您所嘗試的那樣,您必須指定確切的類型。 不幸的是,您的函數不是通用的,而是您的實現是通用的,因此您必須執行以下操作:

fn main() {
    let int: i32 = 45;
    println!("some: {}", <i32 as Generic<bool>>::some(&int));
    // Or,
    println!("some: {}", Generic::<bool>::some(&int));
}

或者,您可以定義一個輔助特征:

trait HasSome {
    fn other_some<T>(&self) -> T where Self: Generic<T> {
        <Self as Generic<T>>::some(self)
    }
}
impl<T> HasSome for T {} // Blanket impl. 

游樂場


另外,請注意,在指定類型或函數的泛型時,您需要使用“turbofish” ::<>運算符:

let foo = Vec::<i32>::new(); // Vec<i32>
let foo = my_generic_function::<usize>(); // Calls my_generic_function with usize
let foo = Option::<usize>::None;
let foo = None::<usize>;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM