Loading...
Ruby型会議
2017/12/11
Steepの話
おさらい
「Rubyプログラムに型を書いていいことにしたら、なにができるか」
Key Ideas
Structural Subtyping
Local Type Inference
Signature Code Separation
Cのヘッダみたいな感じ
Rubyのコードには型定義を書かない
変数とかの注釈は書く
シグネチャのセマンティクスはRubyと違う
Open classなし
メソッドの再定義が発生しない
どの順序で読んでも同じ結果になる
require
などのセマンティクスがあまりに違うのでRubyのコードの中には入れたくない
[Matz] Rubyコードに型を書くと、Nominalなシステムに引きづられるのではないか
[akr] なんで別の場所に書くと避けられるのか?
[matz] コードはみんな見るから。型定義のファイルは見ない人がいる。人間が読むことを仮定しなくて良いので、複雑な形で書いて良い。
[akr] プログラムの中には人間が読めるものしか書けないので、簡単に書けるnominalなものになってしまう。すぐに見えないなら、複雑(で正確な)型が書ける。
[soutaro] 人類はほとんど Nominal な型の世界に生きているのでは
[matz] explicit で Structural な型は面倒くさい
[akr] IO OpenSSL StringIO など、IO もどきはたくさんある。
[soutaro]
def write: (X) → void
の
X
をクラス定義時ではなくクラス利用時に宣言できる言語はない?
[matz]
Go?
[soutaro] Appendable を実装しているクラスを列挙する、というような用途が将来的に考えられる
[akr] 同名のメソッドだが全く異なる挙動をするメソッドが実際に多数存在する((HTTP#, Object#)send、(String#, Integer#)-@、(Object#, HTTP)
#method
)
最近やったこと
self.class.new
問題
new
の型が全然違うので、サブクラスでオーバーライドしたときにサブタイプでなくなる
他の言語では?
インスタンス生成はメソッドではないパターン
(Java,
C++, C#, Type Script)
引数が違うと名前が変わるパターン
(Objective
C)
- [NSObject init]
- [NSString initWithCapacity:(NSUInteger)]
Rubyはどちらでもない
解決策
self.class
の型を
String.class
ではなく
Class
にする
Pros
とりあえずサブタイプにはなる
Cons
self.class.new
したいときに型情報が落ちて悲しい
クラスの型
String.class
にさらに種類をつける
String.class constructor
new
メソッドが生えている
String.class noconstructor
new
メソッドが生えていない
self.class
は
noconstructor
Please turn on JavaScript to use Paper in all of its awesomeness. ^_^
2017/12/11