Eu estava olhando a saída de #[derive(Debug)]
um caso simples usando cargo expand
, onde isto:
#[derive(Debug)]
struct Point {
x: i32,
y: i32,
}
emitido (os comentários adicionados são meus):
#[automatically_derived]
impl ::core::fmt::Debug for Point {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(
f,
"Point",
"x",
&self.x, // <== &
"y",
&&self.y, // <== &&
)
}
}
Note que é &self.x
mas &&self.y
. Tentei com algumas outras situações e o último campo sempre parece obter um extra &
. O valor parece que leva um &dyn Debug
, então estou supondo que isso apenas é desreferenciado automaticamente (em algum lugar) e não importa?
Por que o extra &
?
De acordo com o código fonte :