LINUX.ORG.RU

История изменений

Исправление pftBest, (текущая версия) :

У такого подхода есть и минусы, это проявляется когда нужно отдать изменяемую ссылку на поле структуры. Например есть такая структура:

struct Point {
    x: u32,
    y: u32,
}

impl Point {
    fn get_x(&mut self) -> &mut u32 {
        &mut self.x
    }

    fn get_y(&mut self) -> &mut u32 {
        &mut self.y
    }
}

get_x и get_y отдают ссылку только на часть обьекта, но по сигнатуре не понятно на какую именно часть. Поэтому такой код будет работать:

    let mut p = Point{x: 1, y: 2};
    *p.get_x() = 3;
    *p.get_y() = 4;

А такой код уже не будет работать:

    let mut p = Point { x: 1, y: 2 };
    let px = p.get_x();
    let py = p.get_y();
    *px = 3;
    *py = 4;

https://play.rust-lang.org/?gist=077dd7f656ec26b4696cafe522684b64&version...

Исходная версия pftBest, :

У такого подхода есть и минусы, это проявляется когда нужно отдать изменяемую ссылку на поле структуры. Например есть такая структура:

struct Point {
    x: u32,
    y: u32,
}

impl Point {
    fn get_x(&mut self) -> &mut u32 {
        &mut self.x
    }

    fn get_y(&mut self) -> &mut u32 {
        &mut self.y
    }
}

get_x и get_y отдают ссылку только на чать обьекта, но по сигнатуре не понятно на какую именно часть. Поэтому такой код будет работать:

    let mut p = Point{x: 1, y: 2};
    *p.get_x() = 3;
    *p.get_y() = 4;

А такой код уже не будет работать:

    let mut p = Point { x: 1, y: 2 };
    let px = p.get_x();
    let py = p.get_y();
    *px = 3;
    *py = 4;

https://play.rust-lang.org/?gist=077dd7f656ec26b4696cafe522684b64&version...