2
看看Rc接口,我發現Rc
結構有方法,但它們沒有定義爲self
,所以它們是靜態的,但實際上並沒有阻止它們成爲通常的對象方法。問題是爲什麼他們是這樣定義的?爲什麼,例如,Rc::weak_count的形式定義:的爲什麼有些生鏽類型提供靜態方法而不是對象方法?
fn weak_count(this: &Rc<T>) -> usize
代替:
fn weak_count(&self) -> usize
看看Rc接口,我發現Rc
結構有方法,但它們沒有定義爲self
,所以它們是靜態的,但實際上並沒有阻止它們成爲通常的對象方法。問題是爲什麼他們是這樣定義的?爲什麼,例如,Rc::weak_count的形式定義:的爲什麼有些生鏽類型提供靜態方法而不是對象方法?
fn weak_count(this: &Rc<T>) -> usize
代替:
fn weak_count(&self) -> usize
這是爲了防止陰影的方法,否則將通過Rc
的Deref
和DerefMut
實現可見。引述documentation of Rc
:中Rc
固有的方法是所有相關的功能,這意味着你要叫他們爲例如
Rc::get_mut(&mut value)
而不是value.get_mut()
。這避免了與內部類型T
的方法衝突。
舉例來說,如果你有Rc<Foo>
其中Foo
定義了自己的方法稱爲weak_count
,採用靜態方法將允許用戶編寫foo.weak_count(…)
調用Foo::weak_count
和Rc::weak_count(&foo)
調用Rc::weak_count
。 (由於這個原因,在定義了Deref
/DerefMut
的類型中增加一個固有方法將打破向後兼容性)。
我錯過了同一頁上的官方文檔......我一定很糟糕。我會自我冷落:) –