Что позволяет неявное преобразование из структуры в ее ссылку при вызове метода?

По какому правилу работает следующий код?

struct Dummy(i32);
impl Dummy {
    pub fn borrow(&self) {
        println!("{}", self.0);
    }
}

fn main() {
    let d = Dummy(1);
    (&d).borrow();
    d.borrow();
}

Я жду d.borrow() не будет работать, как он проходит в self который не соответствует сигнатуре метода borrow(&self),

1 ответ

Из ссылки:

Вызов метода состоит из выражения (получателя), за которым следует одна точка, сегмент пути выражения и список выражений в скобках.

При поиске вызова метода получатель может быть автоматически разыменован или заимствован для вызова метода.


Замечания:

Автоматическое разыменование или заимствование действительны только для получателя. Если в качестве получателя нет выражения, оно не будет работать. Компилятор будет ожидать заимствованный тип.

Пример:

fn main() {
    let d = Dummy(1);

    let borrowed = Dummy::borrow(d);
}

Компилятор покажет ошибку:

error[E0308]: mismatched types
  --> src/main.rs:12:34
   |
12 |     let borrowed = Dummy::borrow(d);
   |                                  ^
   |                                  |
   |                                  expected &Dummy, found struct `Dummy`
   |                                  help: consider borrowing here: `&d`
   |
   = note: expected type `&Dummy`
              found type `Dummy`
Другие вопросы по тегам