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], ,arrayi + 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 :
Arc::as_ptr,BTreeMap::remove_entry,Rc::as_ptr,rc::Weak::as_ptr,rc::Weak::from_raw,rc::Weak::into_raw,sync::Weak::as_ptr,sync::Weak::from_raw,sync::Weak::into_raw,str::strip_prefix,str::strip_suffix,char::UNICODE_VERSION,Span::resolved_at,Span::located_at,Span::mixed_site,unix::process::CommandExt::arg0.
char :
for ch in 'a'..='z' {
print!("{}", ch);
}
println!();
// "abcdefghijklmnopqrstuvwxyz"
.
, Cargo Clippy .
1.45.0
, Rust 1.45.0. , !
Rust - . , .
nlinker, funkill, Hirrolot blandger.