前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Rust日报】2020-07-17 无船同志新博客:Shipping Const Generics in 2020

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

作者头像
MikeLoveRust
发布2020-07-21 16:08:25
3170
发布2020-07-21 16:08:25
举报
文章被收录于专栏:Rust语言学习交流

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语言中文社区
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Rust语言学习交流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Rust 1.45发布!
  • 无船同志新博客:Shipping Const Generics in 2020
  • Deno项目内部架构
  • luminance-0.40
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档