Slide 1

Slide 1 text

ざっと理解するRust 2024 Edition 2024-06-05 TechFeed Experts Night @matsu7874 #techfeed_live

Slide 2

Slide 2 text

matsu7874 株式会社estieでソフトウェアエンジニアをしています。 RustでWebアプリケーションを開発しています。 自己紹介 © 2024 estie, Inc. 1

Slide 3

Slide 3 text

1. editionとは 2. Rust 2024 Editionの変更点 目次 © 2024 estie, Inc. 2

Slide 4

Slide 4 text

1. editionとは

Slide 5

Slide 5 text

今年 Rust 2024 Edition がリリース予定 Rust 1.82.0 として 2024-10-17 にリリースされる予定。 1. editionとは © 2024 estie, Inc. 4

Slide 6

Slide 6 text

editionは破壊的変更? 文法に破壊的変更が入る 1. editionとは © 2024 estie, Inc. 5

Slide 7

Slide 7 text

これまでの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

Slide 8

Slide 8 text

2. Rust 2024 Editionの変更点

Slide 9

Slide 9 text

prelude に Future と IntoFuture が追加 use std::future::IntoFuture; // これが不要に async fn meow(phrase: impl IntoFuture) { println!("{}, meow", phrase.await); } よく使うのでpreludeに追加された。 2. Rust 2024 Editionの変更点 © 2024 estie, Inc. 8

Slide 10

Slide 10 text

unsafe fn内でのunsafeな処理に警告 unsafe fn get_unchecked(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

Slide 11

Slide 11 text

RPIT lifetime capture @TaKO8Ki のトークをお楽しみに! 2. Rust 2024 Editionの変更点 © 2024 estie, Inc. 10

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

dependencyと対応したfixturesが外部に公開される [package] name = "mybin" edition = "2021" [dependencies] mylib = { path = "../mylib", features = ["sublib"] } 2. Rust 2024 Editionの変更点 © 2024 estie, Inc. 14

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

Rust 2024 style edition Rust 2024 style editionとしてrustfmtの標準設定が変わります。 https://doc.rust-lang.org/nightly/style-guide/editions.html 2. Rust 2024 Editionの変更点 © 2024 estie, Inc. 16

Slide 18

Slide 18 text

Combine all delimited exprs as last argument overflow_delimited_expr というrustfmtのオプションがデフォルト true で追加される。 これまでstyle guideの仕様と実装が異なっていてクロージャだけぶ ら下がっていた。 最後の引数全体が改行されるのではなく、中身から次の行に書かれ るようにするルール。 2. Rust 2024 Editionの変更点 © 2024 estie, Inc. 17

Slide 19

Slide 19 text

例 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

Slide 20

Slide 20 text

まとめ

Slide 21

Slide 21 text

Rust 2024 Edition より使いやすく prelude に Future と IntoFuture styleの変更 より安全に unsafe fn内でのunsafeな処理に警告 static mut の参照を禁止 より明示的に dependencies の public を明示する optional な features の dep: を必須に まとめ © 2024 estie, Inc. 20