Ruby, Ruby on Railsを実務で使用する中で、レビューで指摘いただいたことや自分で調べた便利メソッドなどをリファクタリングの際のTips集としてまとめたいと思います。
メソッドの返り値にはreturnを使用しない
別の言語を使用する際にはreturn
を使用して返り値を表現することが多いと思いますが、Rubyではreturn
を明示的に書くことは少ないです。
def total(count)
price = 100
sum = price * count
sum # ここでreturnは不要
end
返り値を配列として返したい場合はmapを使用する
numbers
という数字の配列から5以上の数字だけを取り出して result_numbers
という配列に入れたい場合、eachを用いると次のように書くことができます。
def method
result_numbers = []
numbers.each do |number|
result_numbers << sample if number >= 5
end
end
eachの代わりにmapを使えば result_numbers = []
と書かなくても以下のように書くことができます。
mapはブロックで評価した値を配列で返してくれます。
def method
result_numbers = numbers.map do |number|
number if number >= 5
end
end
ぼっち演算子(&.)を用いてレシーバーがnilの場合のハンドリングをする
オブジェクトがnilの場合のハンドリングをしたいときに下記のように書くことができます。
if article
name = article.author
end
ここでオブジェクト&.メソッド
というようにメソッドの前に &.
をつけることでオブジェクトがnilの場合でもエラーが出なくなり、オブジェクトがnilの時のハンドリングを省略して書けます。
name = article&.author # articleがnilの場合はnameにnilを代入。
定数は基本的にfreezeさせて使用する
定数にfreezeメソッドを使用しない場合、以下のように破壊的な変更が可能になってしまいます。
MESSAGE = "hello"
p MESSAGE.upcase! #=> HELLO
意図しない書き換えを防ぐために、freezeメソッドを使用してイミュータブルなオブジェクトに変換しましょう。
そうすると破壊的な変更が行われようとした際に以下のようにエラーが出ます。
MESSAGE = "hello".freeze
p MESSAGE.upcase! #=> can't modify frozen String: "hello" (FrozenError)
ヒアドキュメントを用いて複数行の文字列を定義する
複数行の文字列を定義する場合には下記のように書くことがあると思います。
text = "content1\ncontent2"
この程度の長さなら上記の定義でも問題はなさそうですが、例えばjsonのレスポンスを定義したい場合などにこの書き方をすると見づらくなってしまうと思います。そこでヒアドキュメントを使用すると以下のように定義できます。
text = <<-TEXT
content1
content2
TEXT
文字列を連結する場合は式展開を用いる
文字列を連結したい場合は #+ を用いて連結するのではなく、式展開を用いると良いです。
式展開を用いれば、自動的に .to_s
が走り、余計なエラーが発生しなくなります。
price = 200
# #+ を用いて連結する場合
content = price.to_s + "円"
# 式展開を用いて連結する場合
content = "#{price}円"