第37回 Rubyのお勉強

配列とRange

繰り返し ※ブロックで数値を使うとき
2.upto(8) do |i| print i end
もしくは
(2..8).each do |i| print i end
繰り返し ※ブロックで数値を使わないとき
5.times do print 'hoge' end

ちなみに、ブロックで引数をもらう場合は 0からのインクリメンタルな値が得られる。


Perlライクに 1..3 で配列を定義したいとき

Perlだと

my $c = [1..3];

このように配列を定義できるが、Rubyでは無理。

Rubyでは .. を使った場合生成されるのはRangeクラスのインスタンスなためである。
Rangeクラスはeachという配列と同名のメソッドを持っており、

(1..3).each do |i| print i end

と一見配列を繰り返しているように書けてしまうが、この文で繰り返しているのは配列ではなくてRange。


では、どうすれば、 .. を使って配列をつくれるのか? [1,2,3,4,5]というように一つずつ書くのは極めてめんどうである。
実は簡単で Rangeを配列に変換してやれば良い。 to_aメソッドを使えば変換できる。

print (1..3).to_a.join(',') + "\n";

.to_aしているからこそjoinメソッドが使えているのである。


ちなみに、joinの引数が文字列の場合なら * でもjoinの効果がある。

print (1..3).to_a * ',' + "\n";

ショートコーディングとかのときは便利なんですかね。


参考:
プログラミング言語 Ruby リファレンスマニュアル

HashとStringとシンボル

ハッシュの作り方
h = { :one => 1, :two => 2 };

こんな感じで { } で作れる。キーにはStringかシンボルを指定するのが一般的だと思うんだけど、
以上のうに シンボルでキーを指定した場合。

h['one']

は nil になっちゃう。

h[:one]

だと、もちろん1が返ってくる。 ん〜だとすると、文字列とシンボルが混ぜこぜでつかってあるソースだとどうやってキーを指定すればいいんだろう?
Stringのinternってメソッドを使えばStringをシンボルに変換できるみたい。

h['one'.intern];

だと1が返ってくるのでこれでよいみたい。