首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

Rust 1.45发布!

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

如果不想采用as的默认转换,则需要使用unsafe方法

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

无船同志新博客: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只能是某个type),有了const generics之后,常量值也能作为泛型参数了!

// This is a custom type which is parameterized by a `usize`

pub struct Foo {

bytes: [u8; N],

}

// This is a trait which has been implemented for arrays of

// any length.

// 通过const generic, 我们可以给任意长度的数组impl某个trait

impl Debug for [T; N] {

}

但是,无船同时提到const generic还有两个比较大的局限性,它们还需要多花点时间才能稳定。

1) const generic目前只支持原生的整数类型

比如无符号整数、有符号整数、bool和char,不允许使用任何复合或用户定义的类型,也不允许使用引用(当然也不允许字符串)。主要的原因是为了保证Rust类型系统的健全性,不过比起第二条,这一条是修复起来相对比较容易的。

2) const generic参数不能是基于其他泛型和const的表达式

目前只有两种表达式能够允许作为const generic参数:

普通的const泛型参数。比如,在impl 中,该值可按字面意义用于填充const泛型。

不依赖其他泛型或const generic(我理解为是二阶const generic?),并且可以在const上下文运行的表达式(有点绕);

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

let data = [1, 2, 3, 4, 5, 6];

let sum1 = data.array_chunks().map(|&[x, y]| x * y).sum::();

assert_eq!(sum1, (1 * 2) + (3 * 4) + (5 * 6));

let sum2 = data.array_chunks().map(|&[x, y, z]| x * y * z).sum::();

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语言中文社区

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200717A0ZLC600?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券