在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实现总是运行完全相同的代码,无论是什么(无论好坏).还有别的事吗?如果涉及相关类型或扩展特征,答案是否会改变?
你实际上自己回答了这个问题,恭喜!
由于 Rust 仅通过特征进行有原则的重载/重写,因此本质的语义差异是特征method可以被重写,从而进行定制,而自由函数则不能。
从技术上讲, 和Trait::func(&self)都是mod::func<T: Trait>(&T)单一的,而mod::func(&Trait)不是(因此会产生虚拟调用的轻微开销)。
此外,还有一点内存开销Trait::func(&self):虚拟表中多一个条目。这可能是不易察觉的。
总而言之,选择通常是一种判断。是否打开定制之门是您的选择。
| 归档时间: |
|
| 查看次数: |
860 次 |
| 最近记录: |