查看Rc接口,我发现Rc
结构有方法,但它们是在没有self
的情况下定义的,因此它们是静态的,但实际上并没有阻止它们成为常用的对象方法。问题是为什么这样定义?例如,为什么Rc::weak_count的定义形式为:
fn weak_count(this: &Rc<T>) -> usize
而不是:
fn weak_count(&self) -> usize
答案 0 :(得分:5)
这是为了防止通过Deref
的{{1}}和DerefMut
实现可见的阴影方法。引用documentation of Rc
:
Rc
的固有方法都是相关的功能,这意味着你必须将它们称为例如Rc
代替Rc::get_mut(&mut value)
。这避免了与内部类型value.get_mut()
的方法发生冲突。
例如,如果T
Rc<Foo>
定义了自己的方法Foo
,则使用静态方法将允许用户编写weak_count
来调用{{} 1}}和foo.weak_count(…)
来调用Foo::weak_count
。
(因此,在定义Rc::weak_count(&foo)
/ Rc::weak_count
的类型中添加内部方法会破坏向后兼容性。