Rust 默认Trait方法和参数化函数之间有什么区别?
在Rust中,在编写具有特性的模块时,我往往会遇到设计问题。我并不总是确定我是否想要: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
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!
}
}