メソッド呼び出し時のDerefの優先度
RustでDeref時の優先度について質問です。
pub trait T {
fn func(self);
}
pub struct A {}
impl<'a> T for &'a A {
fn func(self) {
println!("impl &A");
}
}
impl<'a> T for &'a mut A {
fn func(self) {
println!("impl &mut A");
}
}
fn main() {
let mut a = A {};
a.func();
}
以上のコードは実行すると
impl &A
と表示されimpl T for &A {}のfunc()が実行されていることが確認できます。ここでimpl T for &A {}の部分を削除すると出力が
impl &mut A
となります。つまりa.func()は<&A as T>::func(&a)と<&mut A as T>::func(&mut a)の両方の解釈が可能ですが、実際には前者として扱います。
これはRustが暗黙の型変換において&mut Aよりも&Aを優先しているように解釈したのですが、これは言語仕様で決まっているのでしょうか?