1.45版最大的两个改动如下:
1) 修复了浮点数往小整数转换的时候会导致Undefined behavior的问题(这是在未使用unsafe的时候导致的UB,官方团队称这种为unsound bug)
修复方案为:
as
关键字默认为saturating cast这个列子能够很好的理解什么是saturating cast:
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
let x: f32 = 1.0;
let y: u8 = unsafe { x.to_int_unchecked() };
2) 稳定了在expression、match pattern和statement中使用函数式过程宏的功能,这是Rocket发布稳定版之前最后一个依赖的nightly feature
// imagine we have a procedural macro named "mac"
mac!(); // item position, this was what was stable before
// but these three are new:
fn main() {
let expr = mac!(); // expression position
match expr {
mac!() => {} // pattern position
}
mac!(); // statement position
}
增加 char in range
for ch in 'a'..='z' {
print!("{}", ch);
}
// Prints "abcdefghijklmnopqrstuvwxyz"
详细查看官方博客:https://blog.rust-lang.org/2020/07/16/Rust-1.45.0.html
无船同志的这篇新博客探讨了2020年计划稳定Const Generics的部分功能。Const Generics是Rust开发者们期待多年的新功能,没有const generics,rust的数组永远都不能是第一等公民(first class part of the language),我们没有办法给任意长度的数组impl某些trait,以至于在标准库中经常看到只给长度为0到32的数组impl trait(也就是大家看到的LengthAtMost32
,现在已经有了PR在移除这个trait)。
具体来说,const generics到底是指什么呢?中文翻译是常量泛型,常规的泛型参数只能是类型(比如Opiton<T>
这里的泛型T只能是某个type),有了const generics之后,常量值也能作为泛型参数了!
// This is a custom type which is parameterized by a `usize`
pub struct Foo<const N: usize> {
bytes: [u8; N],
}
// This is a trait which has been implemented for arrays of
// any length.
// 通过const generic, 我们可以给任意长度的数组impl某个trait
impl<T: Debug, const N: usize> Debug for [T; N] {
}
但是,无船同时提到const generic还有两个比较大的局限性,它们还需要多花点时间才能稳定。
1) const generic目前只支持原生的整数类型
比如无符号整数、有符号整数、bool和char,不允许使用任何复合或用户定义的类型,也不允许使用引用(当然也不允许字符串)。主要的原因是为了保证Rust类型系统的健全性,不过比起第二条,这一条是修复起来相对比较容易的。
2) const generic参数不能是基于其他泛型和const的表达式
目前只有两种表达式能够允许作为const generic参数:
impl <const N:usize>
中,该值可按字面意义用于填充const泛型。就算有上面这两种限制,const generic依然能够实现一些很棒的功能,比如:
let data = [1, 2, 3, 4, 5, 6];
let sum1 = data.array_chunks().map(|&[x, y]| x * y).sum::<i32>();
assert_eq!(sum1, (1 * 2) + (3 * 4) + (5 * 6));
let sum2 = data.array_chunks().map(|&[x, y, z]| x * y * z).sum::<i32>();
assert_eq!(sum2, (1 * 2 * 3) + (4 * 5 * 6));
Rust编译器能够根据传给map函数的闭包中数组的长度自动推算出chunk的大小!
链接:https://without.boats/blog/shipping-const-generics/
这篇文章是作者前段时间参加Deno项目的创始人Ryan在讲述Deno内部组织架构的talk之后做的笔记。
Ryan的talk: Ryan Dahl - An interesting case with Deno
链接:https://dev.to/ajcwebdev/deno-internal-organization-10mj
luminance 之前是包裝 OpenGL 3.3 的庫,作者一直希望將luminance更新的更好。
這次提供了 luminance-webgl 與 luminance-gl 支援 webgl 與舊機器
luminance-sdl2支援 sdl2
luminance-front方便跨平台
希望大家繼續關注我
链接:https://phaazon.net/blog/luminance-0.40
-- From 日报小组 北纬27度
社区学习交流平台订阅: