Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ざっと理解するRust 2024 Edition

ざっと理解するRust 2024 Edition

2024-06-05に行われた『TechFeed Experts Night#30 〜 Rust / WebAssembly最前線』https://techfeed.io/events/techfeed-experts-night-30 での資料です。
Rust 2024 editionについて当時で公開されていた情報をまとめたものです。
動画が上述のURLに上がっています。

Kentaro Matsumoto

June 05, 2024
Tweet

More Decks by Kentaro Matsumoto

Other Decks in Programming

Transcript

  1. これまでのeditionで書かれたcrateも新しいeditionで 使える [package] name = "lib2015" edition = "2015" pub

    fn add(async: usize, await: usize) -> usize { async + await } [package] name = "bin2021" edition = "2021" use lib2015::add; fn main() { println!("2 + 3 = {}", add(2, 3)); } 1. editionとは © 2024 estie, Inc. 6
  2. prelude に Future と IntoFuture が追加 use std::future::IntoFuture; // これが不要に

    async fn meow(phrase: impl IntoFuture<Output = String>) { println!("{}, meow", phrase.await); } よく使うのでpreludeに追加された。 2. Rust 2024 Editionの変更点 © 2024 estie, Inc. 8
  3. unsafe fn内でのunsafeな処理に警告 unsafe fn get_unchecked<T>(x: &[T], i: usize) -> &T

    { x.get_unchecked(i) // WARNING: requires unsafe block // unsafe { x.get_unchecked(i) } // こうしてほしい } unsafe fn が関数がunsafeであることを示すだけでなく、内部で unsafeな処理が使い放題なっていた。 2. Rust 2024 Editionの変更点 © 2024 estie, Inc. 9
  4. static mutの参照を禁止 static mut: 書き換えできるメモリ上に確保された定数みたいなやつ。 unsafe blockの中からは書き換えらる。 unsafe block内であっても、 static

    mut への参照は禁止される。 これまでは warn でしたがコンパイルできなくなります。 static mut X: i32 = 0; unsafe { let x = &X; // これだめ } やるなら ptr::addr_of_mut! などで生ポインタを触るのがよさそう。 2. Rust 2024 Editionの変更点 © 2024 estie, Inc. 11
  5. public/ private dependencies 意図せず別crate由来の公開APIを公開してしまっている事がある。 内部実装の変更のつもりが公開APIを変更してしまっている事がある ので、明示する。 #[derive(Clone, Debug, PartialEq, Eq,

    serde::Deserialize, serde::Serialize)] pub struct Diagnostic {} [dependencies] serde = { version = "1", features = ["derive"], public = true } https://rust-lang.github.io/rfcs/3516-public-private-dependencies.html 2. Rust 2024 Editionの変更点 © 2024 estie, Inc. 12
  6. Cargo: Remove implicit features https://rust-lang.github.io/rfcs/3491-remove-implicit-features.html optionalなdependenciesに対して dep キーワードが必須になる。 [package] name

    = "mylib" edition = "2021" [dependencies] sublib = { path = "../sublib", optional = true } [features] myfeat = ["sublib"] #[cfg(feature = "sublib")] pub fn add(left: usize, right: usize) -> usize { sublib::add(left, right) } 2. Rust 2024 Editionの変更点 © 2024 estie, Inc. 13
  7. dependencyと対応したfixturesが外部に公開される [package] name = "mybin" edition = "2021" [dependencies] mylib

    = { path = "../mylib", features = ["sublib"] } 2. Rust 2024 Editionの変更点 © 2024 estie, Inc. 14
  8. 2024 Editionでは [package] name = "mylib" edition = "2024" [dependencies]

    sublib = { path = "../sublib", optional = true } [features] myfeat = ["dep:sublib"] #[cfg(feature = "myfeat")] pub fn add(left: usize, right: usize) -> usize { sublib::add(left, right) } 2. Rust 2024 Editionの変更点 © 2024 estie, Inc. 15
  9. Combine all delimited exprs as last argument overflow_delimited_expr というrustfmtのオプションがデフォルト true

    で追加される。 これまでstyle guideの仕様と実装が異なっていてクロージャだけぶ ら下がっていた。 最後の引数全体が改行されるのではなく、中身から次の行に書かれ るようにするルール。 2. Rust 2024 Editionの変更点 © 2024 estie, Inc. 17
  10. 例 fn example() { foo(ctx, |param| { action(); foo(param) });

    foo( ctx, Bar { x: value, y: value2, }, ); } fn example() { foo(ctx, |param| { action(); foo(param) }); foo(ctx, Bar { x: value, y: value2, }); } https://github.com/rust- lang/rustfmt/blob/master/Configurations.md#overflow_delimited_expr 2. Rust 2024 Editionの変更点 © 2024 estie, Inc. 18
  11. Rust 2024 Edition より使いやすく prelude に Future と IntoFuture styleの変更

    より安全に unsafe fn内でのunsafeな処理に警告 static mut の参照を禁止 より明示的に dependencies の public を明示する optional な features の dep: を必須に まとめ © 2024 estie, Inc. 20