默认Trait方法和参数化函数之间有什么区别?

Lin*_*ope 6 rust

在Rust中,在编写具有特征的模块时,我倾向于设计问题.我不总是确定我是否想要:

pub trait Foo {
    fn foo(&self) -> bool;

    fn bar(&self) {
       if self.foo() {
           // Do something!
       } else {
           // Do something else!
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

要么

pub trait Foo {
    fn foo(&self) -> bool;
}

pub fn bar<T>(fooer: &T) where T: Foo {
    if fooer.foo() {
        // Do something!
    } else {
        // Do something else!
    }
}
Run Code Online (Sandbox Code Playgroud)

(当然,真实的例子可能有更复杂的特征或功能签名)

虽然设计问题超出了Stack Overflow的范围,但我并不完全确定我能理解两者之间有意义的,客观的差异,而且我不觉得浏览标准库已经有了很多不足之处.它看起来像生锈一样的标准库更喜欢使用variable.method(),而不是mod::function(&variable)在大多数情况下.然而,这仍然没有真正回答这个问题,因为这只是一个风格指南论证,而不是基于对差异的客观知识.

除了明显的语法差异之外,默认特征方法和模块级参数化函数之间的主要功能差异是什么?我遇到的一个大问题是:默认的特征方法是单形的,以便使用静态调度,还是将它self视为特征对象?

我所看到的唯一区别是,特征的一个impl特性可能会选择覆盖默认的方法实现,希望/可能提供一个实现相同合同的实现,而我保证mod::function实现总是运行完全相同的代码,无论是什么(无论好坏).还有别的事吗?如果涉及相关类型或扩展特征,答案是否会改变?

Mat*_* M. 4

你实际上自己回答了这个问题,恭喜!

由于 Rust 仅通过特征进行有原则的重载/重写,因此本质的语义差异是特征method可以被重写,从而进行定制,而自由函数则不能。

从技术上讲, 和Trait::func(&self)都是mod::func<T: Trait>(&T)单一的,而mod::func(&Trait)不是(因此会产生虚拟调用的轻微开销)。

此外,还有一点内存开销Trait::func(&self):虚拟表中多一个条目。这可能是不易察觉的。

总而言之,选择通常是一种判断。是否打开定制之门是您的选择。