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

问题描述 投票:2回答:1

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

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

代替:

fn weak_count(&self) -> usize
rust
1个回答
5
投票

这是为了防止通过DerefDerefMutRc实现可见的阴影方法。引用documentation of 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的类型中添加内部方法会破坏向后兼容性)。

© www.soinside.com 2019 - 2024. All rights reserved.