Rust の型システムを (ほんのちょっとだけ) 直した話

1.2K Views

October 02, 26

スライド概要

コンパイラのコンパの部分 #03

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

(ダウンロード不可)

関連スライド

各ページのテキスト
1.

Rust の型システムを (ほんのちょっとだけ) 直した話 椎名 @s7tya

2.

Sized コンパイル時にサイズが決まる型 Copy, Send, Sync と同じくトレイトとして扱われる 型パラメータには暗黙的に Sized 制約が付く ?Sized を付けると Sized 制約が外れ、Sized でない型も許容できる

3.

Sized コンパイル時にサイズが決まる型 Copy, Send, Sync と同じくトレイトとして扱われる 型パラメータには暗黙的に Sized 制約が付く ?Sized を付けると Sized 制約が外れ、Sized でない型も許容できる 配列の要素型は Sized である必要がある 構造体やタプルは、最後の要素以外 Sized である必要がある

4.

Q. このプログラムは typecheck するべきか?

5.

Q. このプログラムは typecheck するべきか? ref キーワード パターンマッチで、 ref x と書いた 場合、書かれた場所にマッチする
 値への参照を x に代入する

6.

Q. このプログラムは typecheck するべきか? a の型は &str

7.

Q. このプログラムは typecheck するべきか? このパターン部分にマッチするのは &str から参照をとったもの str

8.

Q. このプログラムは typecheck するべきか? (str, i32) destruct する途中にしか現れないが概念的には !Sized な型がタプルの最後以外の要素の型として出現

9.

Q. このプログラムは typecheck するべきか? (str, i32)

10.

Q. このプログラムは typecheck するべきか? (str, i32) A. 型エラーになるべき

11.

Q. このプログラムは typecheck するべきか? (str, i32) A. 型エラーになるべき 実際: Internal Compiler Error (ICE)

12.

原因 通常 rustc の型チェックでは、型が Well-Formed であることを確認する その中で構造体やタプルの最後の要素以外の要素、配列の要素の型が
 Sized であることを確かめる let PAT; という記法では PAT 全体の WF チェックが行われていなかった 現実的なユースケースでは右辺を省略した形のパターンマッチは稀

13.

修正

14.

おまけ ちょっと待って!それって
 𝓑𝓻𝓮𝓪𝓴𝓲𝓷𝓰 𝓒𝓱𝓪𝓷𝓰𝓮 じゃないですか?

15.

おまけ ちょっと待って!それって
 𝓑𝓻𝓮𝓪𝓴𝓲𝓷𝓰 𝓒𝓱𝓪𝓷𝓰𝓮 じゃないですか? rustc 1.98 まででこのコード片を含むプログラムを使っていた人は rustc 1.99 にアップデートしたことでエラーが出るようになるので 厳密には ✨ 𝓑𝓻𝓮𝓪𝓴𝓲𝓷𝓰 𝓒𝓱𝓪𝓷𝓰𝓮 ✨

16.

crates.io の全クレートと GitHub 上のいくつかのリポジトリを コンパイル & テストするツール

17.

crates.io の全クレートと GitHub 上のいくつかのリポジトリを コンパイル & テストするツール テスト結果

18.

crates.io の全クレートと GitHub 上のいくつかのリポジトリを コンパイル & テストするツール 2 クレートのコンパイル&テストがこの変更で変化してしまった

24.

㊗️ リリース

25.

㊗️ リリース Rust の型システムを(ほんのちょっとだけ) 直した話 椎名 @s7tya