2311rust,到46版本更新
1.43.0
稳定版
项(item)
片段
在宏
中,可用项
片段把项
插值到特征
,实现
和extern
块的块体
中.如:
macro_rules! mac_trait {
($i:item) => {
trait T { $i }
}
}
mac_trait! {
fn foo() {}
}
这生成:
trait T {
fn foo() {}
}
围绕原语的推导类型
改进了围绕原语,引用和二进制
操作的推导类型.如下片段,
let n: f32 = 0.0 + &0.0;
在Rust1.42
中,你会收到错误,说"嘿,不知道如何加f64
和&f64
,而结果是f32
.该算法
现在正确地决定0.0
和&0.0
都应该是f32
.
测试新的Cargo
环境变量
为了帮助整合
测试,Cargo
设置一些新的环境变量
.
假设正在处理叫"cli"
的命令行项目.如果正在编写整合测试
,想调用该cli
二进制文件并查看它的作用.
运行测试
和基准测试
时,Cargo
会设置可在测试中使用的叫CARGO_BIN_EXE_cli
的环境变量:
let exe = env!("CARGO_BIN_EXE_cli");
这使得调用cli
更加容易,因为现在可直接调用.
更改库
现在,不必导入
模块,可直接在浮点数和整数
上使用关联常量
.也即,现在不必用 std::u32;
或用 std::f32;
,就可编写u32::MAX
或f32::NAN
.
有个可重新导出Rust
原语类型的新的原语模块
.编写宏
并想确保类型不会被遮蔽
时,很有用.
此外,还稳定了6个新API
:
Once::is_completed
f32::LOG10_2
f32::LOG2_10
f64::LOG10_2
f64::LOG2_10
iter::once_with
Rust1.43.1
1,修复了无法
检测到的CPU
功能
2,修复破损的cargo package --list
3,OpenSSL
更新到1.1.1g
1.44.0
稳定版
亮点是cargo
中整合了cargo tree
,并在no_std
环境中支持async/await
.
1.45.0
稳定版
修复转换(cast)
中的不健壮性
rustc
使用LLVM
作为编译器后端.编写如下代码时:
pub fn cast(x: f32) -> u8 {
x as u8
}
Rust1.44.0
及更早版本中的Rust
编译器生成如下的LLVM-IR
:
define i8 @_ZN10playground4cast17h1bdf307357423fcfE(float %x) unnamed_addr #0 {
start:
%0 = fptoui float %x to i8
ret i8 %0
}
fptoui
实现了转换,它是"浮点到正整数
"的缩写.
但有个问题.文档中说:
"fptoui"
指令,把浮点数
转换为最接近(圆整为零)的正整数值
.如果该值不适合ty2
,则结果有问题.
即:如果转换大浮点数
为小整数
,你会得到未定义行为
.
即,如,如下没有明确
定义:
fn cast(x: f32) -> u8 {
x as u8
}
fn main() {
let f = 300.0;
let x = cast(f);
println!("x: {}", x);
}
这就是所说的"健壮性
"错误.
不过,花了很久才解决该错误
.原因是不清楚正确
的前进道路
.
最后,决定
这样:
1,as
执行"饱和转换
".
2,如果想跳过检查
,添加新的不安全转换
.
这与访问数组
类似,如:
1,检查array[i]
以确保数组
至少有i+1
个元素.
2,可用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() };
但如常,这只是用作最后的手段.
稳定式,模式和语句
中的类似函数的过程宏
目标是不要求
你编写不安全
代码.
像这样:
gobject_gen! {
class MyClass: GObject {
foo: Cell<i32>,
bar: RefCell<String>,
}
impl MyClass {
virtual fn my_virtual_method(&self, x: i32) {
... 处理x ...
}
}
}
基本上只能在代码
中的特定位置,调用gobject_gen!
.
Rust1.45.0
在三个新地方,增加了调用过程宏
的功能:
//假定有叫`"mac"`的过程宏,
mac!(); //项目位置,这是以前稳定的
//但下三个是新的:
fn main() {
let expr = mac!(); //表达式位置
match expr {
mac!() => {} //模式位置
}
mac!(); //语句位置
}
下面是即将发布的火箭的"helloworld"
示例:
#[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])
}
更改库
在Rust1.45.0
中,以下API
已稳定:
Arc::as_ptr
BTreeMap::remove_entry
Rc::as_ptr
rc::Weak::as_ptr
rc::Weak::from_raw
rc::Weak::into_raw
str::strip_prefix
str::strip_suffix
sync::Weak::as_ptr
sync::Weak::from_raw
sync::Weak::into_raw
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"`
1.45.1
稳定版
修复使用引用的常量传播
在Rust1.45.0
中,在确定是否传播
给定常量
时,rustc
的常
传播趟,没有正确
处理引用
,导致错误的行为.
struct Foo {
x: u32,
}
fn main() {
let mut foo = Foo { x: 42 };
let x = &mut foo.x;
*x = 13;
let y = foo;
println!("{}", y.x); //`->42`;期望成果:`13`
}
1.45.2
稳定版
#[track_caller]
关于特征对象
错误编译
了带#[track_caller]
注解方法的特征对象.#[track_caller]
在1.45
上还不稳定.但是,标准库在某些特征
上利用了它,以获得更好的错误消息. SliceIndex,Index
和IndexMut
的Trait
对象受此bug
影响.
元组模式绑定…到标识
在1.45.1
中,向后移植了#74539
的修复程序,但此修复
程序是错误
的,导致了其他
不相关的破坏.因此,此版本
修复还原该程序.