1
0

More than 3 years have passed since last update.

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

Posted at

結論

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

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0