「初めてのRuby」 2章 配列とハッシュ ※後半のハッシュ

  • 2-1 ハッシュ

何でもオブジェクトなRubyなのでハッシュのキーもオブジェクト。で、そのキーと別のオブジェクトの対応付けを詰めたコンテナがハッシュ。

作るには{}(中括弧)で囲い=>でキーと値を対応付けるので、見た目はPerlで無名ハッシュを作るときに似てる。
キーを指定して値を取り出すときは{}(中括弧)ではなく[](大括弧)で値を囲む。

Perlのundefに相当するらしいnilというもの(両者の違いがどの程度あるのかはまだ知らない)があり、Perlのexists相当のkey?メソッドに加え、定義の範囲外を指定すると例外を起こすfetchメソッドがある。

hash = {
    "ichi" => 1,
    "ni"   => 2,
    "san"  => 3,
    "yon"  => nil,
}

p hash["ichi"]      #=>1

p hash["yon"]       #=>nil
p hash["go"]        #=>nil

p hash.key? "yon"   #=>true
p hash.key? "go"    #=>false

p hash.fetch("yon") #=>nil
p hash.fetch("go")  #=>./hash.rb:19:in `fetch': key not found (IndexError) from ./hash.rb:19

fetchメソッド以外をPerlで書くとこんな感じ?

my %hash = (
    "ichi" => 1,
    "ni"   => 2,
    "san"  => 3,
    "yon"  => undef,
);

print $hash{"ichi"} . "\n";         #=>1

print $hash{"yon"} . "\n";          #=>undef
print $hash{"go"} . "\n";           #=>undef

print exists ($hash{"yon"}) . "\n"; #=>1(真)
print exists ($hash{"go"}) . "\n";  #=>(偽)

Ruby 1.9からオブジェクトではなく"シンボル"というものをキーにしたハッシュを簡単な記法で作れる。(シンボルの正体は4章でわかるらしい・・・)

hash = { ichi: 1, ni: 2, san: 3, yon: nil }
p hash #=>{:rin=>5, :kimiko=>7, :kayo=>nil}

Perlのforeachみたいな処理は、配列の時と同じeachメソッドで書ける。
取り出したキーにも値にも名前が付けられるので少し読みやすい気がする。(Perlのkeysとvaluesを同時に使うような)

hash = {
    "ichi" => 1,
    "ni"   => 2,
    "san"  => 3,
    "yon"  => nil,
}

hash.each do |wamei, atai|
    puts "#{wamei} = #{atai}"
end

Perlでキーも値も使う場合はこんな感じだよね。

my %hash = (
    "ichi" => 1,
    "ni"   => 2,
    "san"  => 3,
    "yon"  => undef,
);

foreach my $wamei (keys %hash){
    print "$wamei = $hash{$wamei}\n";
}

そういえば癖で最期のペアの終わりにも,(カンマ)を入れちゃったけど構文エラーにはならなかった。ありがたい。

2.3 Enumerableモジュール

なんかよくわからないw

(相対的にみて)シンプルな実装のメソッドをベースに新たなメソッドを作る仕組みと、それらを複数集めて名前を付ける仕組みがモジュールってことでいいのかな?

恐らく1章に書いてあった言語そのものをカスタマイズしたりオレオレ言語を作るのに重宝するものと想像。詳しくは後の章に期待しよう・・・