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,
cratelà 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ừ
&&và||. - 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:
u8implementFrom<NonZeroU8>, cùng với các kiểu số khác.Option<&T>implementFrom<&Option<T>>.
Các hàm slice mới đã được thêm vào:
slice::align_tovà phiên bản mutable.slice::chunks_exactvà 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.