SlideShare a Scribd company logo
シグネチャで始める
Rustプログラミング
Superteam Japan Developer Event
Kouta Ozaki / k-kinzal
Rust 大好きおじさん
今日はRustへの愛を語ろうと思う
_人人人人人人人人人人人_
> シグネチャはいいぞ <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
Q. この関数の実装をしてください
A. vを返すだけの関数
副作用がない場合にはこの1パターンしか存在しない
シグネチャが定まると実装が定まる
Rustはシグネチャの表現力が高く実装を定めやすい
厳密に1パターンになることはほぼないが、誰が書いても同じようなコードにしやすい
Rust基礎
foo(v: i32)
所有権の移動
fooはvの所有権を持つためfoo内でvの利用、変更、破棄などを行える
foo(v: &i32)
参照
fooはvの参照を持つためvの利用を行える
特殊ケースとして &[i32] などでは i32の所有権を持ったスライスへの参照ということで
スライスへは参照だがi32に対しては変更などができる
foo(v: &mut i32)
可変参照
fooはvに対して可変参照を持ち、利用、変更などを行える
参照は正確にはfoo<'a>(v: &'a mut i32)というライフタイムを持ち
この関数の実行中は参照先の値が保持されることを保証する
foo<T>(v: T)
ジェネリクス
fooの呼び出し元で決定される型を定義する
後述のトレイト境界を持たない場合、vは振る舞いを持たない
foo<T: Foo + Bar>(v: T)
foo<T>(v: T) where T: Foo + Bar
トレイト境界
fooの呼び出し元で決定される型はFoo Traitの特性を持つことを保証する
この例の場合、fooの呼び出し時に渡せる値はFooとBarの振る舞いを持つものだけになり
foo内部の実装でFoo、またはBarとして扱えるようになる
foo() -> impl Foo
存在型
コンパイル時に決定されるトレイトの具体型
他にもいろいろあるけど今日はこのぐらい
Traitのプレースホルダー型やマクロ
いろいろなシグネチャ
T -> U
単純な型変換の例
このとき所有権が渡っているためTは破棄される
T -> Result<U, E>
失敗する可能性のある型変換の例
(mut T, V) -> T
自身を書き換え所有権を返却する例
ビルダーパターンなどでの定型句
(&mut T, V) -> T
可変参照での自身を書き換える例
T -> U
少し複雑なモデルの状態遷移例
簡単な例でわかる通り厳密に1パターンにはならない
文脈を踏まえるとほぼ1パターンになるケースは多い
ただし必ずそうであることは保証されないのでユニットテストは必須
なぜシグネチャが重要なのか
コードの可読性の向上
シグネチャで実装が保証されるため実装の把握が容易になる
シグネチャで保証しきれない部分は契約(assert)、ユニットテスト、コメントなどで補う
安全性の向上
シグネチャに拘るということは型に拘るということでもあり
ある種のバグを含まないことを保証できる
また呼び出し側としても期待する振る舞いが保証しやすくバグを混入させにくくできる
AIによる開発の生産性向上
人間が文脈上で一意にコードを求めることができるとき
AIもコードを一意に出しやすくできる
つまり適切なシグネチャを作ることができたとき人間はコードを書かずに自動生成できる
つまり安全性と生産性に寄与する
ただし、Rustを使えば寄与するわけではない
緩く作ろうと思えばいくらでも作れる
まとめ
Rustは楽しい!
おわり

More Related Content

More from K Kinzal

ChatGPTをシステムに組み込むためのプロンプト技法 #chatgptjp
ChatGPTをシステムに組み込むためのプロンプト技法 #chatgptjpChatGPTをシステムに組み込むためのプロンプト技法 #chatgptjp
ChatGPTをシステムに組み込むためのプロンプト技法 #chatgptjp
K Kinzal
 
What is GraphQL
What is GraphQLWhat is GraphQL
What is GraphQL
K Kinzal
 
地層化の力学 書きかけ版
地層化の力学 書きかけ版地層化の力学 書きかけ版
地層化の力学 書きかけ版
K Kinzal
 
Scala.jsはじめました!
Scala.jsはじめました!Scala.jsはじめました!
Scala.jsはじめました!
K Kinzal
 
Scala.jsはじめました?
Scala.jsはじめました?Scala.jsはじめました?
Scala.jsはじめました?
K Kinzal
 
Dgeni with AngularJS Application
Dgeni with AngularJS ApplicationDgeni with AngularJS Application
Dgeni with AngularJS Application
K Kinzal
 
Dgeniで始めるドキュメントジェネレーション
Dgeniで始めるドキュメントジェネレーションDgeniで始めるドキュメントジェネレーション
Dgeniで始めるドキュメントジェネレーション
K Kinzal
 
超音波通信という怪しい技術 In html5minutes 7 #tritonjs
超音波通信という怪しい技術 In html5minutes 7 #tritonjs超音波通信という怪しい技術 In html5minutes 7 #tritonjs
超音波通信という怪しい技術 In html5minutes 7 #tritonjs
K Kinzal
 
PHP+伺かで始める新しい通知の形
PHP+伺かで始める新しい通知の形PHP+伺かで始める新しい通知の形
PHP+伺かで始める新しい通知の形
K Kinzal
 

More from K Kinzal (9)

ChatGPTをシステムに組み込むためのプロンプト技法 #chatgptjp
ChatGPTをシステムに組み込むためのプロンプト技法 #chatgptjpChatGPTをシステムに組み込むためのプロンプト技法 #chatgptjp
ChatGPTをシステムに組み込むためのプロンプト技法 #chatgptjp
 
What is GraphQL
What is GraphQLWhat is GraphQL
What is GraphQL
 
地層化の力学 書きかけ版
地層化の力学 書きかけ版地層化の力学 書きかけ版
地層化の力学 書きかけ版
 
Scala.jsはじめました!
Scala.jsはじめました!Scala.jsはじめました!
Scala.jsはじめました!
 
Scala.jsはじめました?
Scala.jsはじめました?Scala.jsはじめました?
Scala.jsはじめました?
 
Dgeni with AngularJS Application
Dgeni with AngularJS ApplicationDgeni with AngularJS Application
Dgeni with AngularJS Application
 
Dgeniで始めるドキュメントジェネレーション
Dgeniで始めるドキュメントジェネレーションDgeniで始めるドキュメントジェネレーション
Dgeniで始めるドキュメントジェネレーション
 
超音波通信という怪しい技術 In html5minutes 7 #tritonjs
超音波通信という怪しい技術 In html5minutes 7 #tritonjs超音波通信という怪しい技術 In html5minutes 7 #tritonjs
超音波通信という怪しい技術 In html5minutes 7 #tritonjs
 
PHP+伺かで始める新しい通知の形
PHP+伺かで始める新しい通知の形PHP+伺かで始める新しい通知の形
PHP+伺かで始める新しい通知の形
 

シグネチャで始めるRustプログラミング - Superteam Japan Developer Event