「プロを目指す人のためのRuby入門」の第5章を読み終わりました。個人的に重要だと思った点をピックアップします。
ハッシュ
ハッシュはキーと値の組み合わせでデータを管理するオブジェクトのこと。他の言語では連想配列やディクショナリ、マップと呼ばれたりする。
{ キー1 => 値, キー2 => 値, キー3 => 値 }
{
'japan' => 'yen',
'us' => 'doller',
'india' => 'rupee',
}
要素の追加、変更、取得
h = {}
h["name"] = "Alison"
h["position"] = "goalkeeper"
h["name"] = "Mamardashvili"
h["position"]
h["number"]
ハッシュを使った繰り返し処理
h = { "name"=> "Alison", "position" => "goalkeeper", "number" => 1 }
h.each do |key, value|
puts "#{key}: #{value}"
end
h.each do |key_value|
p key_value
end
要素の削除
deleteメソッドを使うと指定したキーに対応する要素を削除できる。戻り値は削除された要素の値。
deleteメソッドで指定したキーがなければnilが返る。
ブロックを渡すと、キーが見つからないときにブロックの戻り値をdeleteメソッドの戻り値とすることができる。
currencies = { 'japan' => 'yen', 'us' => 'doller', 'india' => 'rupee'}
currencies.delete('italy') { |key| "Not found: #{key}" }
currencies.delete('japan') { |key| "Not found: #{key}" }
シンボル
シンボルは:シンボルの名前として定義する。
文字列によく似ているが、Rubyの内部では整数として管理されている。
シンボルの特徴と主な用途
ソースコード上では名前を識別できるようにしたいが、その名前が必ずしも文字列である必要でない場合によく使われる。代表的な利用例はハッシュのキー。
ハッシュのキーにシンボルを使うと、文字列よりも高速に値を取り出すことができる。
currencies = { 'japan' => 'yen', 'us' => 'doller', 'india' => 'rupee'}
currencies['japan']
currencies = { :japan => 'yen', :us => 'doller', :india => 'rupee'}
currencies[:japan]
ハッシュのキーがシンボルになる場合、シンボル: 値という記法でハッシュを作成できる。
currencies = { japan: 'yen', us: 'doller', india: 'rupee'}
ハッシュのキーは同じデータ型である必要はないが、無用な混乱を招くので必要でない限りデータ型は揃えた方がいい。
一方、値に関しては異なるデータ型が混在するケースもよくある。
person = {
name: "Alice",
age: 20,
friends: ["Bob", "Carol"],
phones: { home: "1234-0000", mobile: "5678-0000" }
}
person[:age]
person[:friends]
person[:phones][:mobile]
ハッシュで使用頻度の高いメソッド
keysメソッドはハッシュのキーを配列として返す。
currencies = { japan: 'yen', us: 'doller', india: 'rupee'}
currencies.keys
valuesメソッドはハッシュの値を配列として返す。
currencies = { japan: 'yen', us: 'doller', india: 'rupee'}
currencies.values
has_key?メソッドはハッシュの中に指定されたキーが存在するかどうか確認するメソッド。戻り値はtrue/false。key?/include?/member?はいずれもエイリアスメソッド。
currencies = { japan: 'yen', us: 'doller', india: 'rupee'}
currencies.has_key?(:japan)
currencies.has_key?(:italy)
**をハッシュの前に付けると、ハッシュリテラル内でほかのハッシュの要素を展開できる。mergeメソッドを使っても同じ結果が得られる。
h = { us: 'doller', india: 'rupee' }
{ japan: 'yen', **h }
h = { us: 'doller', india: 'rupee' }
{ japan: 'yen' }.merge(h)
メソッド呼び出し時の{}の省略
Rubyでは、最後の引数がハッシュであればハッシュリテラルの{}を省略できるというルールがある。
t.string :email, null: false
t.string(:nickname, { :null => false })
「最後がハッシュであれば{}は省略可能」というルールは配列リテラルでも同様。
a = ['fish', { drink: true, potato: false }]
b = ['fish', drink: true, potato: false ]
ハッシュはto_aメソッドを使うと配列に変換することができる。
currencies = { japan: 'yen', us: 'doller', india: 'rupee'}
currencies.to_a
配列に対してto_hメソッドを呼ぶと配列をハッシュに変換できる。
currencies = [[:japan, "yen"], [:us, "doller"], [:india, "rupee"]]
currencies.to_h
%記法でシンボルやシンボルの配列を作成する
%s!ruby is fun!
%s(ruby is fun)
%i(apple melon orange)
%i!apple melon orange!
name = 'Alison'
%I(hello #{name})
シンボルと文字列の関係
"apple".to_sym
:apple.to_s