結論
以下のようなコードが動くようになります。
n = int 42 # => 42が代入される f = int 4.2 # => TypeError!
やったこと
以下のようにKernel
モジュールにモンキーパッチします
module Kernel module_function def int(var = 0) if var.is_a?(Integer) var else raise TypeError, "#{var} isn't Integer" end end end
あとは、n = int 42
のように書くだけで型宣言っぽくRubyの変数を作ることができます。また異なる型(というかクラス)の値を渡した場合は例外としてTypeError
が発生します。
n = int 42 i = int 21 p n # => 42 p i # => 21 n = int 4.2 # => `int': 4.2 isn't Integer (TypeError)
影響範囲を狭めるのであれば、refinements
で以下のように書けばいいかと
module Type refine Kernel do module_function def int(var = 0) if var.is_a?(Integer) var else raise TypeError, "#{var} isn't Integer" end end end end
あとは使いたい箇所でusing Type
とすればOkです
おわりに
とりあえず、Integer
とかString
とかはこんな感じで型宣言っぽく書けそう。ArrayとかHashとかは何かいい書き方ないか考えてみよう