self 引数への型指定について。

背景情報

self 引数の記法は省略版がよく使われるが、型を明示した記法もある。

省略版 詳細版
self self: Self
&self self: &Self
&mut self self: &mut Self
- 記述不可 - self: Box<Self>
self: Rc<Self>
...

以下は詳細版の例で、method 関数の self 引数が Box<Self> 型になっている。


fn main() {
    let bx = Box::new(Test {});
    bx.method();
}

struct Test {}

impl Test {
    fn method(self: Box<Self>) {
        // nop.
    }
}

使用できる型

self に許される型は、実装対象それ以外では、一部の組込型のみである。

他を指定すると『E0307 - self に使えない型』が発生する。

以下は使用できる型についての公式による説明。

型変換との差異

メソッド呼出と型変換』によると、Box<Self> 型は &Self 型と自動で型変換される。そのため、Box<Self> 型のメソッド引数が役立つのは、&Self で受け入れられる型を除外したい場合に限られる。