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

Rust 默认Trait方法和参数化函数之间有什么区别?,rust,Rust,在Rust中,在编写具有特性的模块时,我往往会遇到设计问题。我并不总是确定我是否想要: pub trait Foo { fn foo(&self) -> bool; fn bar(&self) { if self.foo() { // Do something! } else { // Do something else! } } } 或 pub-trait-F

在Rust中,在编写具有特性的模块时,我往往会遇到设计问题。我并不总是确定我是否想要:

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

    fn bar(&self) {
       if self.foo() {
           // Do something!
       } else {
           // Do something else!
       }
    }
}

pub-trait-Foo{
fn foo(&self)->bool;
}
酒吧fn bar(foore:&T),其中T:Foo{
如果foore.foo(){
//做点什么!
}否则{
//做点别的!
}
}
(当然,真实的例子可能有更详细的特征或功能特征)

虽然设计问题超出了堆栈溢出的范围,但我甚至不能完全确定我是否理解这两者之间有意义、客观的区别,我也不觉得浏览标准库有什么意义。似乎就像Rust的标准库在大多数情况下更喜欢使用
variable.method()
而不是
mod::function(&variable)
。然而,这仍然不能真正回答问题,因为这只是一个风格指导论点,而不是基于对差异的客观认识

除了明显的语法差异外,默认特征方法和模块级参数化函数之间的主要功能差异是什么?我面临的一个大问题是:默认的trait方法是使用单态的静态分派,还是将
self
当作trait对象


我脑海中看到的唯一区别是trait的
impl
可能会选择覆盖默认的方法实现,希望/可能会提供一个满足相同契约的实现,尽管我可以保证
mod::function
实现始终运行完全相同的代码,不管是好是坏。还有别的吗?如果涉及到相关类型或扩展特征,答案会改变吗?

你自己已经回答了这个问题,祝贺你

由于Rust只通过traits进行了原则性的重载/重写,因此本质的语义区别在于trait
方法可以被重写,从而可以进行定制,而自由函数则不能

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

另外,
Trait::func(&self)
:虚拟表中的另一个条目也有轻微的内存开销。这可能是看不见的

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

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!
    }
}