【Rust日报】2020-07-17 无船同志新博客:Shipping Const Generics in 2020

2020-07-21 16:08:25 浏览数 (1)

Rust 1.45发布!

1.45版最大的两个改动如下:

1) 修复了浮点数往小整数转换的时候会导致Undefined behavior的问题(这是在未使用unsafe的时候导致的UB,官方团队称这种为unsound bug)

修复方案为:

  • as 关键字默认为saturating cast

这个列子能够很好的理解什么是saturating cast:

代码语言:javascript复制
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));
}

上面的代码打印出:

代码语言:javascript复制
too_big_casted = 255
too_small_casted = 0
not_a_number_casted = 0
  • 如果不想采用as的默认转换,则需要使用unsafe方法
代码语言:javascript复制
let x: f32 = 1.0;
let y: u8 = unsafe { x.to_int_unchecked() };

2) 稳定了在expression、match pattern和statement中使用函数式过程宏的功能,这是Rocket发布稳定版之前最后一个依赖的nightly feature

代码语言:javascript复制
// 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

代码语言:javascript复制
for ch in 'a'..='z' {
    print!("{}", ch);
}
// Prints "abcdefghijklmnopqrstuvwxyz"

详细查看官方博客:https://blog.rust-lang.org/2020/07/16/Rust-1.45.0.html

无船同志新博客:Shipping Const Generics in 2020

无船同志的这篇新博客探讨了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之后,常量值也能作为泛型参数了!

代码语言:javascript复制
// 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参数:

  • 普通的const泛型参数。比如,在impl <const N:usize>中,该值可按字面意义用于填充const泛型。
  • 不依赖其他泛型或const generic(我理解为是二阶const generic?),并且可以在const上下文运行的表达式(有点绕);

就算有上面这两种限制,const generic依然能够实现一些很棒的功能,比如:

代码语言:javascript复制
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项目内部架构

这篇文章是作者前段时间参加Deno项目的创始人Ryan在讲述Deno内部组织架构的talk之后做的笔记。

Ryan的talk: Ryan Dahl - An interesting case with Deno

链接:https://dev.to/ajcwebdev/deno-internal-organization-10mj

luminance-0.40

luminance 之前是包裝 OpenGL 3.3 的庫,作者一直希望將luminance更新的更好。

這次提供了 luminance-webgl 與 luminance-gl 支援 webgl 與舊機器

luminance-sdl2支援 sdl2

luminance-front方便跨平台

希望大家繼續關注我

链接:https://phaazon.net/blog/luminance-0.40

-- From 日报小组 北纬27度

社区学习交流平台订阅:

  • Rustcc论坛: 支持rss
  • 微信公众号:Rust语言中文社区

0 人点赞