Rubyで型宣言っぽくコードを書けるようにしてみた

結論

以下のようなコードが動くようになります。

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とかは何かいい書き方ないか考えてみよう