我在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();
}
现在......我理解这段代码的意图,它是实现自我消费模式的特质:
fn foo(self);
好的......但是什么?
您可以将自己定性为Self
以外的其他内容吗?除了Self
,&Self
,&mut 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();
}
感觉有点像这是遗留box foo
语法遗留下来的遗留问题,他们真的想要允许fn foo(box self)
,但是如果没有盒子语法,那么它就不一致了。但我仍然不明白这种接收器类型的功能目的是什么。
(编辑,因为相关的问题是古老的,并没有专门回答这个问题。请参阅https://github.com/rust-lang/rust/issues/44874关于这个问题的持续讨论; tldr:显然任意接收器类型是一个东西,他们&# 39;重新上路但不稳定)