はじめに
最近使い方がわかってきたメソッドを5つまとめました。
5選と言いつつ、丁度5つしかありません。
values_at
引数で指定されたキーに対応する値の配列を返します。
h = {1=>"a", 2=>"b", 3=>"c"}
p h.values_at(1,3,4)
#=> ["a", "c", nil]
例えば、ユーザーのプロフィール情報がハッシュに格納されていて、特定の情報(例:名前、年齢、住所)だけを取得したい場合などに使います。
profile = {name: "Taro", age: 20, address: "Tokyo", job: "Engineer"}
p profile.values_at(:name, :age) #=> ["Taro", 20]
max
maxは、配列の要素から最大値を返すメソッドです。
引数がない場合、配列の中から最大の要素を返します。
引数がある場合、引数で指定した数だけ最大の要素を降順の配列で返します。
sample = [5, 8, -6, 15]
result = sample.max # resultには15が返されます
result = sample.max(2) # resultには[15, 8]という配列が返されます
min
min、配列の要素から最小値を返すメソッドです。
引数がない場合、配列の中から最小の要素を返します。
引数がある場合、引数で指定した数だけ最小の要素を昇順の配列で返します。
sample = [5, 8, -6, 15]
result = sample.min # resultには-6が返されます
result = sample.min(2) # resultには[-6, 5]という配列が返されます
個人的には引数で与えるのではなく、配列で比較するように使うと便利でした。
transform_values
transform_valuesは、ハッシュの全ての値に対してブロックを呼び出し、その結果で置き換えた新しいハッシュを返します。
h = { a: 1, b: 2, c: 3 }
h = h.transform_values {|v| v * v + 1 } # hは{ a: 2, b: 5, c: 10 }になります
ハッシュの全ての値に対して同じ操作を適用したい場合に便利です。
例としては、商品の価格がハッシュに格納されていて、全ての価格に対して税を適用したい場合などに使えそうです。
prices = {apple: 100, banana: 200, orange: 150}
prices_with_tax = prices.transform_values {|price| price * 1.1 }
p prices_with_tax #=> {:apple=>110.0, :banana=>220.0, :orange=>165.0}
tap
tapは、レシーバ(呼び出し元のオブジェクト)を引数としてブロックを評価し、その後でレシーバを返します。
value = 10
value = value.tap{|x| p x * 2 } # 20が出力され、valueは10のままです
tapメソッドはレシーバをそのまま返すため、メソッドチェーンの途中で変数の値を確認するなどのデバッグに利用できます。
[1, 2, 3, 4, 5].tap { |x| puts "original: #{x.inspect}" }.select { |x| x.even? }
# original: [1, 2, 3, 4, 5] => [2, 4]