Rust 1.45.0: stabilisation des macros procédurales fonctionnelles, correction des défauts de conversion

L'équipe Rust a le plaisir d'annoncer la sortie d'une nouvelle version, 1.45.0. Rust est un langage de programmation qui permet à n'importe qui de créer des logiciels fiables et efficaces.



Si vous avez installé une version précédente de Rust à l'aide d'outils rustup, pour passer à la version 1.45.0, il vous suffit d'exécuter la commande suivante:



rustup update stable


Si vous ne l'avez pas déjà rustup, vous pouvez l' installer à partir de la page appropriée sur notre site Web, et également le consulter sur GitHub .



Ce qui est inclus dans la version stable 1.45.0



Cette version contient deux grands changements: la correction de bogues de longue date dans la conversion entre les nombres entiers et les nombres à virgule flottante, et la stabilisation des fonctionnalités nécessaires pour qu'au moins un framework Web s'exécute sur Rust stable.



Correction des défauts dans les transformations



Initialement, le numéro 10184 a été ouvert en octobre 2013, pendant un an et demi avant la sortie de Rust 1.0. Puisqu'il rustcutilise LLVM comme compilateur principal, lorsque vous écrivez du code comme celui-ci:



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


le compilateur Rust dans les versions 1.44.0 et antérieures a généré le LLVM-IR suivant:



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