LoginSignup
12
11

More than 5 years have passed since last update.

[妄想] Rubyに欲しい文法

Last updated at Posted at 2014-10-09

表題の通りだけど、Rubyコミュニティのことをよく知らないのでここに書いてみることにします。
誰か見てくれると嬉しいな。

動的型チェック(型に限らないけど)

Rubyに型チェックがほしいという人はそこそこいるみたいだけど、現状のRubyと静的解析は相性がよくないので、
だったら動的に使いやすい仕組みにしたい。

def foo(t1 value1, t2 value2)
end

これが

def foo(value1, value2)
  raise TypeError, "#{value1} must be #{t1}" unless t1 === value1
  raise TypeError, "#{value2} must be #{t2}" unless t2 === value2
end

こんな風に変換されるのを期待したい。

そう展開するルールであれば、

def foo(String str, Integer num)
  # ...
end

という想像通りの使い方の他にも

def get_content(/^https?:/ url)
  # ...
end

のように正規表現を書くことができる。
===という演算はcase-whenで使われるのでRubyらしいと思う。

自動endブロック

Rubyのdo-endはとても良いのだけど、ネストが深くなりがちだと思う。
例えばファイルを読み書きするとReadとWriteで2段になるし、たいてい中でeachするのでもう一段必要。

なので

Dir.chdir(some_path) do
  autoend src  = File.open(src_path, 'r')
  autoend dst  = File.open(dst_path, 'w')
  autoend line = src.each
  dst.print line unless /^#/ =~ line
end

こう書けて

Dir.chdir(some_path) do
  File.open(src_path, 'r') do |src|
    File.open(dst_path, 'w') do |dst|
      src.each |line|
        dst.print line unless /^#/ =~ line
      end
    end
  end
end

こんな風に変換してほしい。

具体的には autoendが出てきたら次の式からendが来るまでを一つのブロックとして最初の式に渡す。
ブロックを開くタイミングはバラバラな事も多いけど、閉じるのはたいてい最後にまとめて行うことが多いので都合がよい。
ただし適当なキーワード(ここではautoend)を使うと確実に既存のコードとぶつかるので、どうにかしないといけない。

これができるとC++erのデストラクタによるRAIIが好きな人とかJavaScripterでコールバックが嫌いな人とかC#erでawait好きな人とかScalaユーザでfor式が好きな人が喜ぶはず。

最後に

Rubyでは「短いが正義」だと思う

12
11
3

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
12
11