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

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.kler.cn/a/137329.html

相关文章:

  • MQTT通信协议使用说明
  • 智慧箱变动环辅控系统
  • Thales安全解决方案:国家网络安全的关键
  • python 迭代器
  • SQL sever2008数据库备份、还原以及库检查
  • Linux系统编程 系统编程概念
  • CV计算机视觉每日开源代码Paper with code速览-2023.11.16
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • SAP gui 登录条目不让修改
  • 电子秤方案:做一个宠物勺方案设计
  • GCANet
  • 【MATLAB基础绘图第17棒】绘制玫瑰图
  • Maven工程继承关系,多个模块要使用同一个框架,它们应该是同一个版本,项目中使用的框架版本需要统一管理。
  • springboot上传文件
  • zabbix-proxy分布式监控
  • python实现FINS协议的TCP服务端(篇二)
  • Mysql数据库管理-Innodb 内存优化分析
  • 【ARM AMBA AXI 入门 14 -- AXI 窄位传输 | 非对齐传输| 大小端传输】
  • 平衡二叉树c语言版
  • ubuntu从源码编译gdal