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

Vic*_*voy 2 rust

看看Rc接口,我发现Rcstruct有方法,但它们是没有定义的,self所以它们是静态的,但实际上并没有什么能阻止它们成为常用的对象方法.问题是为什么这样定义?例如,为什么Rc :: weak_count在表单中定义:

fn weak_count(this: &Rc<T>) -> usize
Run Code Online (Sandbox Code Playgroud)

代替:

fn weak_count(&self) -> usize
Run Code Online (Sandbox Code Playgroud)

Ruf*_*ind 5

它是为了防止通过DerefDerefMut实现可见的阴影方法Rc.引用以下文档Rc:

固有的方法Rc都是相关的功能,这意味着你必须将它们称为例如Rc::get_mut(&mut value)而不是value.get_mut().这避免了与内部类型的方法冲突T.

例如,如果您在Rc<Foo>其中Foo定义了自己的方法weak_count,则使用静态方法将允许用户写入foo.weak_count(…)调用Foo::weak_countRc::weak_count(&foo)调用Rc::weak_count.

(因此,将内部方法添加到定义Deref/ DerefMut将向后兼容的类型中).