为什么有些防锈类型提供静态方法而不是对象方法?

时间:2017-12-27 13:44:48

标签: rust

查看Rc接口,我发现Rc结构有方法,但它们是在没有self的情况下定义的,因此它们是静态的,但实际上并没有阻止它们成为常用的对象方法。问题是为什么这样定义?例如,为什么Rc::weak_count的定义形式为:

fn weak_count(this: &Rc<T>) -> usize

而不是:

fn weak_count(&self) -> usize

1 个答案:

答案 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的类型中添加内部方法会破坏向后兼容性。