そうだ、Rubyをやろう(1日目)

ホワイの(感動的)Rubyガイドは面白い。
本当に。

この天才的なドキュメントを電車の中でちょっとずつ読み進めているだけで、なんだかちょっとだけRubyのことが分かったような気分になってくる。今のところ、まだ、網羅的にRubyの世界をくんかくんかしているくらいだが、いくつか特徴的なことは覚えた。ついでに、初めてのRubyもざっと読み直した。

ブロック

一番最初に感動したのはこのブロックというやつだ。
「初めてのRuby」では高階関数と例えられていた。
なんのこっちゃ、と思ったが、なんてことはない。
関数を引数や戻り値として使うことのようだ。

3.times {print "hey"}

Cで3と書いたらint値だが、Rubyでは整数オブジェクトになるらしい。
上記命令は、整数オブジェクトのtimesメソッドに関数オブジェクトを渡しているということになるんだと。
すげ!


宇宙船(UFO)演算子

JavaのComparator#compareみたいなもの。
記法がスマート。

x = 15
y = 10
p x <=> y    #=>1

正規表現

PerlとかVim正規表現みたいな記法ができる。
言語レベルで正規表現が組み込まれているなんてCプログラマあがりの私にはちょっとびっくり。
JavaだってRegexが標準APIに組み込まれたのはたしか、1.4とかその辺だったのだよ。

while num = gets
    unless /\A-?\d+\Z/ =~ num
        $stderr.puts "整数を入力してください"
        next
    end
    #...
end

あと地味に、このunlessというif文の指定も便利っすね。


イテレータとブロックで流れるように〜

0.upto(9).map{|n| n*n}.each{|n| p n}

eachの他には、select, reject, inject辺りが便利そうな。


ひとまとまりの要素のうち1つでも条件に該当したならば

any?というイテレータ(なのかな?)はすごく便利だと思いました。

(2..100).each do |candidate|
    sqrt = Math.sqrt(candidate);
    factor_found = (2..sqrt).any? {|i| 0 == candidate % i}

    if factor_found then
        print "#{candidate}は合成数\n"
    else
        print "#{candidate}は素数\n"
    end
end

その他、覚え書き

  • 強い型付け
  • 数値演算は自動的に(必要に応じて)多倍長をサポート
  • 文字列はmutabile, 数値はimmutable
  • 1.9から文字列の多言語サポートを強化
  • inspectメソッドがJavaのtoString
  • バッククォート文字列でコマンド実行
  • 1.8までと1.9以降でブロック引数の扱いが違う(1.9以降はブロックローカル扱い)
  • ブロック内からのコールバックにはyield式を使う
  • ブロックを値として引数で受け取るには、引数の名前の前に&をつけるとProcオブジェクトとしてもらえる
  • ruby -v でバージョン確認
  • ri {クラス名} でman



他に気になるところとしては、既存クラスに動的にメソッドを追加したりできるらしいが、今のところ使い道がよくわかってないっす。

まぁ、なんだか

やれそうかもしれない

気がする