Что позволяет неявное преобразование из структуры в ее ссылку при вызове метода?
По какому правилу работает следующий код?
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`