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) → voidX をクラス定義時ではなくクラス利用時に宣言できる言語はない?
  •  [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.classnoconstructor