什么是自我:Box <self>&#39;一个方法?

时间:2018-01-15 01:28:03

标签: 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();
}

现在......我理解这段代码的意图,它是实现自我消费模式的特质:

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;重新上路但不稳定)

0 个答案:

没有答案