看看Rc界面,我发现Rc
结构有方法,但它们是在没有self
的情况下定义的,所以它们是静态的,但实际上并没有什么能阻止它们成为常用的对象方法。问题是为什么这样定义?例如,为什么Rc::weak_count的定义形式如下:
fn weak_count(this: &Rc<T>) -> usize
代替:
fn weak_count(&self) -> usize
这是为了防止通过Deref
的DerefMut
和Rc
实现可见的阴影方法。引用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
的类型中添加内部方法会破坏向后兼容性)。