LINUX.ORG.RU

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

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

struct A(pub i32);

struct B(A);

impl Clone for B {
    fn clone(&self) -> Self {
        Self( A(self.0.0) )
    }
}
trait Inface { fn inface(&mut self); }
impl Inface for B {
    fn inface(&mut self){
        self.0.0 += 1;
        println!("{}", self.0.0);
    }
}
impl Default for B {
    fn default() -> Self {
        Self(A(42))
    }
}
impl B {
    pub fn print_a(&self){
        println!("{}", self.0.0);
    }
}

fn f<T: Clone+Inface>(v:&T){
    let mut copy = v.clone();
    copy.inface();
}
fn main() {
    let b = B::default();
    f(&b);
    b.print_a();
}

Прямо вот употел приседая (нет). В чём проблема-то, собственно? UB, пардон, я повторять не буду. И почему растовик вдруг забудет Copy, (а так же Clone c Debug), необходимость рассмотрения которых вылезет сразу же после первой попытки тестировать? Плюсовик же вот не забыл поставить struct вместо class и A() = default? И это у плюсовика вероятность забыть что-то подобное намного выше - язык дико раздутая и измученная стандартизацией помойка. А раст это как раз язычок специально спроектированный чтобы компилятор не давал забывать и не прощал. А вот попробуй повторить в плюсах что-то такое:

    // метод  в любом типе
    pub fn move_out(self)->Self {
        self

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

И это корёжит весь код.

Это только если мозг покорёжен дурными сишными привычками. Можно так рассматривать: мув - это такая минимальная фундаментальная операция, сохраняющая его идентичность и максимальный контроль над всевозможными контрактами/инвариантами объекта данного типа. Копирование - это дополнительная фича, уже в какой-то мере ослабляющая/размывающая этот контроль, соответсвенно должна добавляться с осознанием программистом. Что консистентно с идеей языка, который позиционируется как системный, т.е. надёжный. А значит по дефолту всё должно быть максимально ограниченное - инициализированое, иммутабельное, приватное, не копируемое и т.д.

Исправление zurg, :

struct A(pub i32);

struct B(A);

impl Clone for B {
    fn clone(&self) -> Self {
        Self( A(self.0.0) )
    }
}
trait Inface { fn inface(&mut self); }
impl Inface for B {
    fn inface(&mut self){
        self.0.0 += 1;
        println!("{}", self.0.0);
    }
}
impl Default for B {
    fn default() -> Self {
        Self(A(42))
    }
}
impl B {
    pub fn print_a(&self){
        println!("{}", self.0.0);
    }
}

fn f<T: Clone+Inface>(v:&T){
    let mut copy = v.clone();
    copy.inface();
}
fn main() {
    let b = B::default();
    f(&b);
    b.print_a();
}

Прямо вот употел приседая (нет). В чём проблема-то, собственно? UB, пардон, я повторять не буду. И почему растовик вдруг забудет Copy, (а так же Clone c Debug), необходимость рассмотрения которых вылезет сразу же после первой попытки тестировать? Плюсовик же вот не забыл поставить struct вместо class и A() = default? И это у плюсовика вероятность забыть что-то подобное намного выше - язык дико раздутая и измученная стандартизацией помойка. А раст это как раз язычок специально спроектированный чтобы компилятор не давал забывать и не прощал. А вот попробуй повторить в плюсах что-то такое:

    // метод  в любом типе
    pub fn move_out(self)->Self {
        self

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

И это корёжит весь код.

Это только если мозг покорёжен дурными сишными привычками. Можно так рассматривать: мув - это такая минимальная фундаментальная операция, сохраняющая максимальный контроль над всевозможными контрактами/инвариантами объекта данного типа. Копирование - это дополнительная фича, уже в какой-то мере ослабляющая/размывающая этот контроль, соответсвенно должна добавляться с осознанием программистом. Что консистентно с идеей языка, который позиционируется как системный, т.е. надёжный. А значит по дефолту всё должно быть максимально ограниченное - инициализированое, иммутабельное, приватное, не копируемое и т.д.

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

struct A(pub i32);

struct B(A);

impl Clone for B {
    fn clone(&self) -> Self {
        Self( A(self.0.0) )
    }
}
trait Inface { fn inface(&mut self); }
impl Inface for B {
    fn inface(&mut self){
        self.0.0 += 1;
        println!("{}", self.0.0);
    }
}
impl Default for B {
    fn default() -> Self {
        Self(A(42))
    }
}
impl B {
    pub fn print_a(&self){
        println!("{}", self.0.0);
    }
}

fn f<T: Clone+Inface>(v:&T){
    let mut copy = v.clone();
    copy.inface();
}
fn main() {
    let b = B::default();
    f(&b);
    b.print_a();
}

Прямо вот употел приседая (нет). В чём проблема-то, собственно? UB, пардон, я повторять не буду. И почему растовик вдруг забудет Copy, (а так же Clone c Debug), необходимость рассмотрения которых вылезет сразу же после первой попытки тестировать? Плюсовик же вот не забыл поставить struct вместо class и A() = default? И это у плюсовика вероятность забыть что-то подобное намного выше - язык дико раздутая и измученная стандартизацией помойка. А раст это как раз язычок специально спроектированный чтобы компилятор не давал забывать и не прощал. А вот попробуй повторить в плюсах что-то такое:

    // метод  в любом типе
    pub fn move_out(self)->Self {
        self

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

И это корёжит весь код.

Это только если мозг покорёжен дурными сишными привычками. Можно так рассматривать: мув - это такая минимальная фундаментальная операция сохраняющая максимальный контроль над всевозможными контрактами/инвариантами объекта данного типа. Копирование - это дополнительная фича, уже в какой-то мере ослабляющая/размывающая этот контроль, соответсвенно должна добавляться с осознанием программистом. Что консистентно с идеей языка, который позиционируется как системный, т.е. надёжный. А значит по дефолту всё должно быть максимально ограниченное - инициализированое, иммутабельное, приватное, не копируемое и т.д.