「初めてのRuby」 2章 配列とハッシュ ※今日は配列

  • 2.1.1 配列の構築

配列は数字オブジェクトや文字オブジェクトへの参照を順に詰められるコンテナ。
要素を並べて作るときはPerlの()(丸括弧)とは異なり、[](角括弧)を使う(無名の配列を作るときと同じ)

さくらVPSの上で対話インタフェースのirbを使ってみた。

$ irb
irb(main):001:0> str = "hoge" #=>文字オブジェクトを用意
=> "hoge"
irb(main):002:0> num = 123     #=>数字オブジェクトを用意
=> 123
irb(main):003:0> p hako = [str, num] #=>並べて配列を作成
["hoge", 123]
=> nil
irb(main):004:0> str[2] = 'm'  #=>元の文字列オブジェクトを変更
=> "m"
irb(main):005:0> p hako        #=>参照だから反映される!
["home", 123]
=> nil
irb(main):006:0> num += 10     #=>数字も変えてみる。
=> 133
irb(main):007:0> p hako        #=>あれ?w
["home", 123]
=> nil

おや、+=を使うと別のオブジェクトが複製されちゃうのかな?演算子の説明に期待。
ちなみにPerlでも標準入力を渡せば対話インタフェース風にはなる(親切ではないけどw)

$ perl
my $str = "hoge";
my $num = 123;
my @hako = ($str, $num);
print @hako;
(Ctrl-dを押下)
hoge123
  • 2.1.2 添字参照

...(三点リーダじゃないよ!)はタイポじゃなくて"末尾を含まない"の意味。

irb(main):001:0> hako = ["a", "b", "c", "d"]
=> ["a", "b", "c", "d"]
irb(main):002:0> p hako[0...2]
["a", "b"]
=> nil

Perlで試したらこうなった。許されるのか(汗

my @list = ("a", "b", "c", "d");
print $list[0...2]; #=>b

そして配列もオブジェクトなので、見た目は他の言語と同じように操作してるけど実はArray#[]メソッドの別表記とのこと。

irb(main):001:0> hako = ["a", "b", "c", "d"]
=> ["a", "b", "c", "d"]
irb(main):002:0> p hako.[](0..2)
["a", "b", "c"]
=> nil
  • 2.1.3 添字代入

代入の範囲に対して要素数が足りないと配列が短くなる。

irb(main):001:0> hako = ["a", "b", "c", "d"]
=> ["a", "b", "c", "d"]
irb(main):002:0> hako[0..2] = "x"
=> "x"
irb(main):003:0> p hako
["x", "d"]
=> nil

Perlだとこうなった。どういう動きなんだ・・・

my @list = ("a", "b", "c", "d");
$list[0..2] = "x";
print @list; #=>axcd
  • 2.1.5 様々なメソッド

ソートと重複削除もメソッド。これ気に入った!

irb(main):001:0> hako = ["A", "z", "@", "a", "Z", "a"]
=> ["A", "z", "@", "a", "Z", "a"]
irb(main):002:0> p hako.sort
["@", "A", "Z", "a", "a", "z"]
=> nil
irb(main):003:0> p hako.uniq
["A", "z", "@", "a", "Z"]
=> nil

↑はソートや重複削除をかけた新しい配列オブジェクトを返してて、hako.uniq!みたいに"!"を付けると元の配列オブジェクトが書き換わる。

Perlで言うところのforeachやmapを書くにもメソッドがある。

irb(main):001:0> hako = ["A", "z", "@", "a", "Z", "a"]
=> ["A", "z", "@", "a", "Z", "a"]
irb(main):002:0> hako.each do |nakami|
irb(main):003:1*   print nakami + " "
irb(main):004:1> end
A z @ a Z a => ["A", "z", "@", "a", "Z", "a"]

do ~ endを{ ~ }だと思えば割りと自然に読めるかも。個人的にはif~fiよりは好きだw

  • doと波括弧

実は他の言語でよくある{ ~ }も使えるけどdo ~ endとは結合強度が違うとのこと。
処理を目立たせるために両者を使い分けると言うベストプラクティス的な提案の記述も。



眠いからハッシュは明日にしよう。。