Rust 1.45.0: menstabilkan makro prosedural fungsional, memperbaiki cacat konversi

Tim Rust dengan bangga mengumumkan rilis versi baru, 1.45.0. Rust adalah bahasa pemrograman yang memungkinkan siapa saja membuat perangkat lunak yang andal dan efisien.



Jika Anda menginstal Rust versi sebelumnya menggunakan alat rustup, maka untuk meningkatkan ke versi 1.45.0 Anda hanya perlu menjalankan perintah berikut:



rustup update stable


Jika Anda belum memilikinya rustup, Anda dapat menginstalnya dari halaman yang sesuai di situs web kami dan juga melihatnya di GitHub .



Apa yang termasuk dalam versi stabil 1.45.0



Rilis ini berisi dua perubahan besar: memperbaiki bug yang sudah lama ada dalam mengonversi antara bilangan bulat dan angka floating point, dan menstabilkan fitur yang diperlukan setidaknya untuk satu kerangka web agar berjalan pada Rust yang stabil.



Koreksi cacat dalam transformasi



Awalnya Masalah 10184 dibuka pada Oktober 2013, selama satu setengah tahun sebelum rilis Rust 1.0. Karena ia rustcmenggunakan LLVM sebagai kompiler backend-nya, saat Anda menulis kode seperti ini:



pub fn cast(x: f32) -> u8 {
    x as u8
}


kompilator Rust di versi 1.44.0 dan yang lebih lama menghasilkan LLVM-IR berikut:



define i8 @_ZN10playground4cast17h1bdf307357423fcfE(float %x) unnamed_addr #0 {
start:
  %0 = fptoui float %x to i8
  ret i8 %0
}


fptoui "floating point to unsigned integer".



, :



‘fptoui’ ( ) . ty2, .

The ‘fptoui’ instruction converts its floating-point operand into the nearest (rounding towards zero) unsigned integer value. If the value cannot fit in ty2, the result is a poison value.


, , . , : , .



, , :



fn cast(x: f32) -> u8 {
    x as u8
}

fn main() {
    let f = 300.0;

    let x = cast(f);

    println!("x: {}", x);
}


Rust 1.44.0 "x: 0", .. , . «» ( unsafe ) — , . I-unsound, .



. , , .



:



  • as " " (saturating cast),
  • unsafe , .


, :



  • array[i] , , array i + 1 ,
  • unsafe { array.get_unchecked(i) }, .


, ? :



fn cast(x: f32) -> u8 {
    x as u8
}

fn main() {
    let too_big = 300.0;
    let too_small = -100.0;
    let nan = f32::NAN;

    println!("too_big_casted = {}", cast(too_big));
    println!("too_small_casted = {}", cast(too_small));
    println!("not_a_number_casted = {}", cast(nan));
}


:



too_big_casted = 255
too_small_casted = 0
not_a_number_casted = 0


. ( ). NaN .



API :



let x: f32 = 1.0;
let y: u8 = unsafe { x.to_int_unchecked() };


, , . , , , .



,



Rust 1.30.0 « ». , gnome-class:



Gnome- — Rust. Rust- -, , GObject, , , GObject. , .

:



gobject_gen! {
    class MyClass: GObject {
        foo: Cell<i32>,
        bar: RefCell<String>,
    }

    impl MyClass {
        virtual fn my_virtual_method(&self, x: i32) {
            ... do something with x ...
        }
    }
}


" " — , , gobject_gen! .



Rust 1.45.0 :



// ,      "mac"

mac!(); //  , ,    

//    3 :
fn main() {
  let expr = mac!(); //  

  match expr {
      mac!() => {} //  
  }

  mac!(); //  
}


, , : Rocket. - Rocket, 2016 , , Rust. ", " :



#[macro_use] extern crate rocket;

#[get("/<name>/<age>")]
fn hello(name: String, age: u8) -> String {
    format!("Hello, {} year old named {}!", age, name)
}

#[launch]
fn rocket() -> rocket::Rocket {
    rocket::ignite().mount("/hello", routes![hello])
}


Rocket . , , Rocket proc_macro_hygiene . , , ! Rocket. !



Rocket , , :)





Rust 1.45.0 :





char :



for ch in 'a'..='z' {
    print!("{}", ch);
}
println!();
//  "abcdefghijklmnopqrstuvwxyz"


.





, Cargo Clippy .



1.45.0



, Rust 1.45.0. , !





Rust - . , .



nlinker, funkill, Hirrolot blandger.




All Articles