7月26日、RustチームはRust 1.80.0を発表した。
Rustは信頼性が高く効率的なソフトウェアを構築するためのプログラミング言語であり、今回のバージョンアップではいくつかの新機能と改善が含まれている。以下に主な変更点を紹介する。
本記事は、以下のエキスパートに監修していただきました:
LazyCell
と LazyLock
これらの「遅延」タイプは、データの初期化を初めてアクセスされるまで遅らせるものである。1.70で安定化されたOnceCell
とOnceLock
タイプに似ているが、セル内に初期化関数を含んでいる点が異なる。この機能はもともと、人気のあるlazy_staticおよびonce_cellクレートから、標準ライブラリに取り入れられた機能を安定化させたものである。
LazyLock
はスレッドセーフなオプションであり、static
値のような場所に適している。以下の例では、LAZY_TIME
は一度だけ初期化される。どちらの使用者もその初期化方法を知らなくてもよい。
use std::sync::LazyLock;
use std::time::Instant;
static LAZY_TIME: LazyLock<Instant> = LazyLock::new(Instant::now);
fn main() {
let start = Instant::now();
std::thread::scope(|s| {
s.spawn(|| {
println!("Thread lazy time is {:?}", LAZY_TIME.duration_since(start));
});
println!("Main lazy time is {:?}", LAZY_TIME.duration_since(start));
});
}
LazyCell
はスレッド間での同期を行わないため、static
には適していないが、thread_local!
静的変数で使用できる。それぞれのタイプは、スレッドセーフの必要性に応じて、他のデータ構造でも使用可能である。
cfg
名と値のチェック
1.79でrustc
の--check-cfg
フラグが安定化されたことで、Cargo 1.80では、そのチェックがすべてのcfg
名と値に対して有効になった。
これには、Cargo.toml
のフィーチャー名や、新しいcargo::rustc-check-cfg
出力が含まれる。不正なcfg
はデフォルトで警告として報告され、例えば以下のように、誤ったfeature
値が設定されているコードが検出される。
fn main() {
println!("Hello, world!");
#[cfg(feature = "crayon")]
rayon::join(
|| println!("Hello, Thing One!"),
|| println!("Hello, Thing Two!"),
);
}
warning: unexpected `cfg` condition value: `crayon`
--> src/main.rs:4:11
|
4 | #[cfg(feature = "crayon")]
| ^^^^^^^^^^--------
| |
| help: there is a expected value with a similar name: `"rayon"`
|
= note: expected values for `feature` are: `rayon`
= help: consider adding `crayon` as a feature in `Cargo.toml`
= note: see <https://doc.rust-lang.org/nightly/rustc/check-cfg/cargo-specifics.html> for more information about checking conditional configuration
= note: `#[warn(unexpected_cfgs)]` on by default
この警告は、実際のrayon
フィーチャーが有効かどうかに関係なく報告される。
終点を含まない範囲がパターンとして使えるようになった
Rustの範囲パターンでは、a..bまたは..bのような終点を含まない範囲を使用できるようになった。これにより、下記例のように始点と終点で同じ定数を再利用するコードが書けるようになった。
pub fn size_prefix(n: u32) -> &'static str {
const K: u32 = 10u32.pow(3);
const M: u32 = 10u32.pow(6);
const G: u32 = 10u32.pow(9);
match n {
..K => "",
K..M => "k",
M..G => "M",
G.. => "G",
}
}
詳細はAnnouncing Rust 1.80.0を参照していただきたい。