ベスパリブ

プログラミングを主とした日記・備忘録です。ベスパ持ってないです。

a.clone() == ref_a.clone() == (*ref_a).clone() なのか?(Rust)

#[derive(Debug, Clone, PartialEq)]
struct Circle {
    x: f64,
    y: f64,
    radius: f64,
}

impl Circle {
    pub fn area(self) -> f64 {
        // std::f64::consts::PI * (self.radius * self.radius)
        std::f64::consts::PI * (3.1 * 3.1)
    }
}

fn main() {
    let a = Circle { x: 0.0, y: 0.0, radius: 2.0 };
    let ref_a = &a;

    assert_eq!(a.clone(), ref_a.clone());
    assert_eq!(ref_a.clone(), (*ref_a).clone());
}

Rust Playground で実行

実行するとエラーは発生しなかった。

a.clone() == ref_a.clone() == (*ref_a).clone() なのだ。

Cloneトレイトの説明 を見るに、ref_a が与えられたら (*ref_a.clone).clone() としないと駄目でしょ、と思ってたんですけどそんなことはなかったです。

「暗黙的な参照外し」や「参照外し型強制」とか言うらしいですね。