「初めての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!みたいに"!"を付けると元の配列オブジェクトが書き換わる。
- 2.1.6 ブロック付きメソッドとイテレータ
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とは結合強度が違うとのこと。
処理を目立たせるために両者を使い分けると言うベストプラクティス的な提案の記述も。
眠いからハッシュは明日にしよう。。