Considere o seguinte código:
fn main() {
let foo = 1;
let bar: i32 = -&foo; //ok, -1
let baz: i32 = &foo; //error, expected `i32`, found `&{integer}`
let bad: i32 = !&foo; //ok, -2
}
Lendo a referência de ferrugem, descobri que
Os possíveis locais de coerção são:
- let instruções onde um tipo explícito é fornecido.
[...]
- Argumentos para chamadas de função
Portanto, let baz: i32 = &foo;
também deve funcionar, pois é uma instrução let com um tipo explícito fornecido.
Por que ele se recusa a ser compilado?
Os casos 1 e 3 não são coerção, mas apenas como esses operadores são definidos. Por exemplo,
E o mesmo
-&foo
aconteceu com typei32
. É o mesmo para!&foo
. As anotações de tipo nas linhasbar
ebad
não estão fazendo nada.Enquanto isso, a linha 2 não é uma coerção permitida: em nenhum lugar da lista de coerções que você vinculou está escrito que
&T
pode ser coagidoT
; fazer isso requer cópia (desreferenciação) ou clonagem.