【ruby】rubyでよく使うメソッドまとめ その2

その1から読みたい人はこちら

yasagori-programing.hatenablog.jp

to_hメソッド

値をハッシュ化する。

ary = [["name", "Coco"], ["age", 7]]
ary.to_h
=> {"name"=>"Coco", "age"=>7}

valuesメソッド

hashのvalueだけを抽出する。

ary = [["name", "Coco"], ["age", 7]]
ary.to_h.values
=> ["Coco", 7]

tapメソッド

tapは自分自身にブロックを使って自分自身を返すメソッド。デバッグなんかでよく使われる。

ary = [1, 3, 5, 7]
ary.map{|x| x * 2}
=> [2, 6, 10, 14]
ary.map{|x| x * 2 }.select{|x| x > 10}
=> [14]
ary.map{|x| x * 2 }.tap{|a| p a}.select{|x| x > 10}
[2, 6, 10, 14]  # tapの結果、ここではmapした結果のaを出力している
=> [14]

これを使うと他にも色々できる。よくやるのがハッシュ化。

ary = [1, 3, 5, 7]
{}.tap{|h| ary.each{|x| h[x] = x * 2}}
=> {1=>2, 3=>6, 5=>10, 7=>14}

# 分割するとこうも書ける
{}.tap do |h|
  ary.each do |x|
    h[x] = x * 2
  end
end

空のハッシュを用意し、aryのそれぞれに対してx * 2をしたものを入れていく。

||=

よく使うこの子、パッとわからないことが多いから忘れないように。

x = 15
x ||= 2
=> 15  # xには値が入っているからそれが反映される
y ||= 10
=> 10  # yにはまだ代入されていないから、y = 10となり出力される

find_by_attributes

Petテーブルがあった場合、attributesにテーブルのカラム名を入れると使える。

id name age dog_breed
1 Coco 7 Dachshund
2 Maru 2 Mix
3 Pochi 5 Shiba
def index
  @my_dog = Pet.find_by_name("Maru")
  @japan_dogs = Pet.find_by_dog_breed("Shiba")
end

compactメソッド

Arrayからnilを除く。

pets = ["Coco", "Maru", nil, "Shiba"]
pets.compact
=> ["Coco", "Maru", "Shiba"]

rescueメソッド

例外の時の動作を指定する。

def foo(x)
  begin
    puts x * 5 if x > 0
  rescue => e
    puts "error"
  end
end

foo(5)
=> 25
foo(0)
=> nil  # xはintなのでbegin節で評価されている
foo("a")
=> error  # xがstrなのでbegin節で評価されないため、rescueの中が動く

ちなみにワンライナーで書くとこんな感じ

def foo(x)
  puts x * 5 if x > 0 rescue puts "error"
end

まとめ

tapが難しい。。。