我在 Rust 代码中看到了一些这种模式的实例:
trait Task {
fn run(self: Box<Self>) -> i32;
}
struct SomeTask {}
impl Task for SomeTask {
fn run(self: Box<SomeTask>) -> i32 {
1
}
}
fn main() {
let task: Box<Task> = Box::new(SomeTask {});
task.run();
}
Run Code Online (Sandbox Code Playgroud)
现在......我理解这段代码的意图,它是一个实现自消费模式的特征:
fn foo(self);
Run Code Online (Sandbox Code Playgroud)
好吧……但是什么?
您可以将 self 限定为Self? 除了Self, &Self,&mut Self和, 显然还有其他东西 self 可以Box<Self>吗?
为什么存在此功能,因为您已经可以在没有它的情况下执行此操作:
trait Runnable {
fn run(self) -> i32;
}
trait Task {
fn value(&self) -> i32;
}
struct SomeTask {}
impl Runnable for Box<Task> {
fn run(self: Box<Task>) -> i32 {
self.value()
}
}
impl Task for SomeTask {
fn value(&self) -> i32 {
1
}
}
fn main() {
let s: Box<Task> = Box::new(SomeTask {});
s.run();
}
Run Code Online (Sandbox Code Playgroud)
感觉这有点像缺少box foo语法的遗留问题,他们真正想要允许的地方fn foo(box self),但是首先没有框语法就不一致......但我仍然不明白它的功能目的是什么这种接收器类型是。
(编辑,因为相关问题很古老并且没有具体回答问题。有关此问题的持续讨论,请参阅https://github.com/rust-lang/rust/issues/44874;tldr:显然任意接收器类型是一件事,他们正在路上但还不稳定)
| 归档时间: |
|
| 查看次数: |
745 次 |
| 最近记录: |