Cập nhật Rust phiên bản 1.31

Phiên bản ổn định 1.31.0

Rust 1.31 có thể là một trong những phiên bản thú vị nhất! Sử dụng Cargo để tạo một dự án mới:

cargo new bar

File Cargo.toml sẽ có nội dung:

[package]
name = "bar"
version = "0.1.0"
authors = ["Tên tác giả"]
edition = "2018"
[dependencies]

Khóa edition đã được thêm vào phần [package]. Nếu khóa này không tồn tại, giá trị mặc định sẽ là 2015.

Trong Rust 2018, một số tính năng mới đã được thêm vào, vốn bị cấm trong Rust 2015. Mỗi crate có thể được viết trong chế độ 2015 hoặc 2018, và chúng có thể làm việc cùng nhau một cách trơn tru. Các crate 2018 có thể sử dụng các crate phụ thuộc 2015 và ngược lại. Tất cả các tính năng mới đều là tùy chọn, đảm bảo tính tương thích và không làm分割 hệ sinh thái.

Việc di chuyển mã nguồn từ Rust 2015 sang Rust 2018 có thể được thực hiện tự động bằng cách sử dụng cargo fix.

Tăng cường kiểm tra vay mượn

Checker vay mượn thông minh hơn, hiện tại chấp nhận một số đoạn mã hợp lệ mà trước đây nó từ chối. Ví dụ:

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

Nếu y được sử dụng:

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

Bây giờ, thông báo lỗi sẽ rõ ràng hơn:

error[E0502]: Không thể thực hiện vay mượn có thể thay đổi vì đã có một vay mượn không thể thay đổi "x"

và chỉ ra vị trí xung đột.

Thực hiện các thay đổi模块 hệ thống

Giờ đây:

  • Ngay gần không cần extern crate.
  • Có thể sử dụng use để import các macro thay vì sử dụng thuộc tính #[macro_use].
  • Đường dẫn tuyệt đối bắt đầu bằng tên crate, crate là từ khóa biểu diễn crate hiện tại.
  • Các file và thư mục có cùng tên có thể tồn tại một cách hòa bình.
  • Không cần file mod.rs trong thư mục con chứa các submodule.

Quy tắc 生命周期 được đơn giản hóa

Một số quy tắc lifecycle đã được thêm vào cho các khối impl và định nghĩa hàm:

impl<\'a> Reader for BufReader<\'a> {
    // Nội dung phương thức
}

Bây giờ có thể viết:

impl Reader for BufReader<\'_> {
    // Nội dung phương thức
}

Biểu thức \'_ vẫn biểu diễn rằng BufReader chấp nhận tham số, nhưng không cần phải tạo tên lifecycle.

Các lifecycle vẫn cần được khai báo trong struct:

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

Trong Rust 2018, lifecycle \'a được suy diễn tự động.

Const functions

Bây giờ có thể định nghĩa các hàm const như:

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

Các hàm này có thể được sử dụng như các hàm thông thường, nhưng cũng có thể được sử dụng trong các môi trường compile-time:

const SIX: i32 = add_one(5);

Trong trường hợp này, hàm add_one sẽ được thực thi vào compile-time, và SIX sẽ nhận giá trị 6.

const fn yêu cầu output có tính chất quyết định và không phụ thuộc vào các biến runtime. Bạn có thể:

  • Thực hiện các phép toán và so sánh với các kiểu số.
  • Thực hiện các phép toán boolean ngoại trừ &&||.
  • Tạo các mảng, struct, enum và tuples.
  • Gọi các hàm khác nếu chúng cũng là const fn.
  • Truy cập các phần tử qua chỉ số trong mảng và slice.
  • Truy cập các trường trong struct và tuples.
  • Đọc các giá trị const, không cần đến các static.
  • Sử dụng các tham chiếu và con trỏ.
  • Thực hiện các phép chuyển đổi ngoại trừ các con trỏ nguyên thủy.

Công cụ mới

Phiên bản Rust 2018 đã giới thiệu các công cụ mới:

  • Clippy: Một linter cho Rust.
  • Rustfmt: Định dạng mã nguồn Rust.
  • Suppourt cho các IDE mới.

Clippy có thể được cài đặt và sử dụng như sau:

rustup component add clippy
cargo clippy

Rustfmt cũng tương tự:

rustup component add rustfmt
cargo fmt

Công cụ kiểm tra

Trong Rust 1.31, các công cụ kiểm tra đã được thêm vào:

#[allow(clippy::option_unwrap_used)]

Bây giờ có thể thêm namespace cho các kiểm tra lint:

![allow(clippy::option_unwrap_used)]

Không cần phải sử dụng cfg_attr như trước đây:

//![cfg_attr(feature = "cargo-clippy", allow(option_unwrap_used))]
// Thay bằng
#![allow(clippy::option_unwrap_used)]

Stabilization trong thư viện

Các implement mới cho trait From:

  • u8 implement From<NonZeroU8>, cùng với các kiểu số khác.
  • Option<&T> implement From<&Option<T>>.

Các hàm slice mới đã được thêm vào:

  • slice::align_to và phiên bản mutable.
  • slice::chunks_exact và các phiên bản mutable, cũng như các phiên bản reverse.

Thay đổi trong Cargo

Cargo bây giờ sử dụng HTTP/2 để tải các gói một cách song song. Bạn có thể thêm các gói phụ thuộc mà không cần extern crate:

[dependencies]
baz = { version = "0.1", package = "foo" }

Bây giờ có thể gọi crate foo bằng tên baz trong mã nguồn.

Thẻ: Rust cargo Clippy Rustfmt const fn

Đăng vào ngày 26 tháng 6 lúc 10:02