什么是方法上的“self: Box<Self>”?

Dou*_*oug 6 rust

我在 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:显然任意接收器类型是一件事,他们正在路上但还不稳定)