結論
以下のようなコードが動くようになります。
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とかは何かいい書き方ないか考えてみよう