6
目前,Rust還沒有「特質專業化」功能。據我所知,這意味着一種特定類型的特徵不能被實施一次以上。但是,我注意到Borrow
trait實施for T where T: ?Sized
這是所有非參考類型(右?)。但它也適用於其他幾種類型,如Vec<T>
,看起來像專業化。`借用'如何在沒有特質專業化的情況下工作?
這是如何工作的?它是編譯器的魔力還是我誤解了什麼特質專業化?
目前,Rust還沒有「特質專業化」功能。據我所知,這意味着一種特定類型的特徵不能被實施一次以上。但是,我注意到Borrow
trait實施for T where T: ?Sized
這是所有非參考類型(右?)。但它也適用於其他幾種類型,如Vec<T>
,看起來像專業化。`借用'如何在沒有特質專業化的情況下工作?
這是如何工作的?它是編譯器的魔力還是我誤解了什麼特質專業化?
在這種情況下,特徵專業化是沒有必要的,因爲實現是不重疊的。
在Vec<T>
的特殊情況下,也有適用於它的許多impls。例如,以下內容:
impl<T> Borrow<T> for T where T: ?Sized
impl<'a, T> Borrow<T> for &'a T where T: ?Sized
impl<'a, T> Borrow<T> for &'a mut T where T: ?Sized
// other implementations are omitted for conciseness
根據這些實施方式中,編譯器可以推導出以下內容:
Vec<T>
實現Borrow<Vec<T>>
&'a Vec<T>
實現Borrow<Vec<T>>
&'a mut Vec<T>
實現Borrow<Vec<T>>
但是,它們都沒有爲Vec<T>
實施Borrow<[T]>
。由於沒有提供實施,您可以自行提供:
impl<T> Borrow<[T]> for Vec<T>