当前位置: 首页 > news >正文

2311rust,1.31版本更新

1.31.0稳定版

Rust1.31可能是最激动人心的版本!
使用Cargo创建一个新项目:

cargo new foo

以下是Cargo.toml的内容:

[package]
name = "foo"
version = "0.1.0"
authors = ["名字"]
edition = "2018"
//版本.
[dependencies]

[package]:edition下添加了一个新键.注意,已设置为2018年.如果键不存在,则设置它为2015默认值.

Rust2018,可解锁一些Rust2015中禁止的新功能.
注意,每个包都可20152018模式,它们可无缝地协同工作.2018项目可用2015依赖项,2015项目可用2018依赖项.
确保不会分裂生态系统,且所有这些新事物都是选入的,从而确保兼容.此外,迁移Rust2015代码到Rust2018时,可通过cargo fix自动更改.

借用检查器更聪明,现在接受一些以前拒绝的有效代码.
请看该例:

fn main() {let mut x = 5;let y = &x;let z = &mut x;
}

如果确实使用了y,如:

fn main() {let mut x = 5;let y = &x;let z = &mut x;println!("y: {}", y);
}

Rust2018中,该错误更好了:
error[E0502]:因为已按不变借用,无法按可变借用"x"
并显示借用冲突的位置.

简化模块系统

1,几乎不再需要extern crate.
2,可用use而不是#[macro_use]属性导入宏.
3,绝对路径以crate名开头,而crate关键字表示当前crate.
4,foo.rsfoo/子目录可共存;在子目录中放置子模块时不再需要mod.rs.

省略生命期规则

impl块和函数定义添加了一些额外省略规则.代码如下:

impl<'a> Reader for BufReader<'a> {//方法在此
}

现在可这样写:

impl Reader for BufReader<'_> {//方法在此
}

'_生命期仍显示BufReader接受参数,但不再需要为它创建名字.
仍要在结构中定义生命期.但是,不再需要像以前那么多的样板:

//`2015`
struct Ref<'a, T: 'a> {field: &'a T
}
//`2018`
struct Ref<'a, T> {field: &'a T
}

'a是推导出来的.

FN

Rust中定义函数有几种方法:带有fn普通函数,带不安全fn不安全(unsafe fn)函数,带extern fn的外部函数.
再添加1个限定函数的新方法:const fn.它像这样:

const fn foo(x: i32) -> i32 {x + 1
}

可像普通函数一样调用const fn,但也可在常环境中使用.如果是,则在编译时而不是运行时求值.如:

const SIX: i32 = foo(5);

这在编译时执行foo,并设置SIX6.
const fn必须要有确定性输出,你可以:
1,整数的算术比较符号
2,除&&||之外的所有布尔符号
3,构造数组,结构,枚举和元组
4,调用其他常fn
5,数组和切片上的索引式
6,字段访问结构和元组
7,从中读取(但不是静态,甚至不引用静态)
8,引用&和*
9,转换,但转换整数原始指针除外

新工具

2018版中,为所有用户准备了新一代工具:Clippy,RustfmtIDE支持.

Rustlinter,clippy现在可在稳定的Rust上使用.

rustup component add clippy
//安装
cargo clippy
//运行.

Clippy现在是1.0,它有与rustc相同的lint稳定性保证.可添加新的lint,且可修改lint以添加更多功能,但可能永远不会删除(仅弃用)lint.
Rustfmt用来格式化Rust代码.自动格式化代码可让你使用官方的Rust风格.

rustup component add rustfmt
//安装
cargo fmt
//使用.

检查工具

Rust1.30中,稳定了如#[rustfmt::skip]等"工具属性".在Rust1.31中,稳定了一些检查工具,
比如为lint提供了名字空间,以便知道来源的:

#[allow(clippy::bool_comparison)]

如果以前用过Clippylints,可这样迁移:

//旧
#![cfg_attr(feature = "cargo-clippy", allow(bool_comparison))]
//新功能
#![allow(clippy::bool_comparison)]

不再需要cfg_attr了!

库稳定

添加了一堆From实现:
1,u8现在实现From<NonZeroU8>,对其他数值类型及其NonZero等效项也同样.
2,Option<&T>实现From<&Option<T>>,也实现了&mut
此外,这些功能已稳定下来:
1,slice::align_to及其可变
2,slice::chunks_exact,及可变版和所有组合中的r版本(如slice::rchunks_exact_mut)

货物

Cargo现在使用HTTP/2并行下载包.
此外,现在不必extern crate,

extern crate foo as baz;

这样,重命名仓库很麻烦.因此,可在Cargo.toml中这样,如下:

[dependencies]
baz = { version = "0.1", package = "foo" }
//依赖.
[dependencies.baz]
version = "0.1"
package = "foo"

现在,可在代码中通过baz使用foo包.

http://www.lryc.cn/news/237474.html

相关文章:

  • 文心一言-情感关怀之旅
  • 下厨房网站月度最佳栏目菜谱数据获取及分析PLus
  • buildadmin+tp8表格操作(5)自定义组装搜索的查询
  • 企业级固态硬盘如何稳定运行?永铭固液混合铝电解电容来帮忙
  • 【MISRA C 2012】Rule 4.2 不应该使用三连符
  • spring boot加mybatis puls实现,在新增/修改时,对某些字段进行处理,使用的@TableField()
  • 如何构建风险矩阵?3大注意事项
  • SpringSecurity5|12.实现RememberMe 及 实现原理分析
  • 持续集成交付CICD:Jenkins Sharedlibrary 共享库
  • Linux--网络编程
  • 数据结构 并查集
  • 算法通关村第十六关黄金挑战——求滑动窗口中的最大值(滑动窗口与堆方法、双端队列法和直接比较法)
  • 常见树种(贵州省):009楠木、樟木、桂木种类
  • 全志H616开发版
  • 【Spring boot】RedisTemplate中String、Hash、List设置过期时间
  • Nosql之redis概述及基本操作
  • 使ros1和ros2的bag一直互通
  • 【正点原子 linux 驱动编程】
  • 使用Python的turtle模块绘制玫瑰花图案(含详细Python代码与注释)
  • Redis学习笔记14:基于spring data redis及lua脚本ZSET有序集合实现环形结构案例及lua脚本如何发送到redis服务器
  • openssl C++研发之pem格式处理详解
  • 【教3妹学编辑-mysql】详解数据库三大范式
  • 【计算机网络笔记】路由算法之链路状态路由算法
  • 读像火箭科学家一样思考笔记04_第一性原理(下)
  • 开源集群管理系统对比分析:Kubernetes 与 Apache Mesos
  • matlab 坡度滤波算法地面分割
  • 【腾讯云 HAI域探秘】高性能服务器引领AI革新浪潮:从AI绘画、知识问答到PyTorch图像分类、视频检测的全方位探索
  • 【Java】ExcelWriter自适应宽度工具类(支持中文)
  • C++二分查找算法:132模式枚举3简洁版
  • Map 和 WeakMap:JavaScript 中的键值对集合