Ruby初心者が覚えておきたい。Rubyっぽい書き方。
はじめに
Rubyを勉強していく中で教材や参考書などに、「これは覚えておくと便利」というTipsをよく見かけます。とりあえずそれをまとめていこうかなーという記事です。
後置if
ifやunlessもそうですが、処置が1行で済むような場合は以下のような書き方ができます。
puts 'Hello World!' if true
=> Hello World!
1行でスッキリしてていい感じですね。
ぼっち演算子 &.
これを使うとオブジェクトがnilであった場合でもエラーが発生しなくなります。
例えば以下のような感じ。
user = nil
# 普通に書くとエラーが出る
user.name
=> NoMethodError
# ぼっち演算子「&.」を使うとnilになり、エラーにならない
user&.name
=> nil
上記と同じものをif文で書くとこんな感じ。
if user
user.name
else
nil
end
# nilが返ってくる
=> nil
三項演算子で書くとこんな感じ。
user ? user.name : nil
# nilが返ってくる
=> nil
ちなみに「&.」の正式名称は、「safe navigation operator」って読むらしいです。
安全ナビのオペレーターって意味っぽいですが、どういうこと?ってなりました。
あと「&.」が、ひとりぼっちで座っている絵の形に似ていたので「ぼっち演算子」らしいです。
うーん。どんな絵が見てみたいですね。
nilガード
その名の通り、nilをガードするやつ。
nil以外のデフォルト値を入れたい時に便利なコードです。
以下のような書き方で、
「numberが真ならnumber、偽なら10をnumberに代入する」という意味です。
number ||= 10
これと同じ意味ですね。
number || (number = 10)
%記法
配列の要素が全て文字列である場合は、「%w」を使って書くこともできます。
# 通常の記法
ary = ['apple', 'banana', 'orange']
=> ["apple", "banana", "orange"]
# %記法
ary = %w(apple banana orange)
=> ["apple", "banana", "orange"]
また全ての要素がシンボルである場合は、「%i」を使って書くこともできます。
# 通常の記法
ary = [:apple, :banana, :orange]
=> [:apple, :banana, :orange]
# %記法
ary = %i(apple banana orange)
=> [:apple, :banana, :orange]
ハッシュのいろんな書き方
# 文字列をキーにしている
{ "age" => 20, "gender" => male }
# ハッシュロケット(=>)の代わりに、コロン(:)を使っている
{ "age" : 20, "gender" : male }
# シンボルをキーにしている
{ :age => 20, :gender => male }
# コロンを使っている(このパターンがよく使われている)
{ age: 20, gender: male }
# 数字を使っている
{ 1 => 0000, 2 => 1111 }
うーん。何が何やら混乱しそう。
配列の各要素から特定の値だけ取り出す
例えば以下のようなコードがあります。
class User
attr_reader :name
def initialize(name)
@name = name
end
end
user1 = User.new('佐藤一朗')
user2 = User.new('佐藤一朗')
user3 = User.new('佐藤一朗')
users = [user1, user2, user3]
この変数usersから、各ユーザーの名前だけを取得するにはどうすればいいでしょうか?
答えはmapメソッドを使います。
names = users.map do |user|
user.name
end
=> ["佐藤一朗", "佐藤一朗", "佐藤一朗"]
しかし、もっと簡潔に書くことができます!
# do ~ end の代わりに、{}を使う方法
names = users.map { |user| user.name }
=> ["佐藤一朗", "佐藤一朗", "佐藤一朗"]
{}を使う方法もいい感じですが、「&:メソッド名」という引数を渡すとより簡潔にコードを書くことができます。
# 「&:メソッド名」という引数を渡す方法
names = users.map(&:name)
=> ["佐藤一朗", "佐藤一朗", "佐藤一朗"]
つまるところこういうことです。
# ①ブロックの引数が1つだけ => |user|
# ②ブロックの中で、メソッドに引数がない => name
# ③ブロックの中で、メソッドを1回呼び出す以外の処理がない => { |user| user.name }
users.map { |user| user.name }
おわりに
初心者のうちは、何書いているのか考えながら読まないといけないですが、慣れたらコード書くのも読むのも早くなりそうですね。
Rubyを勉強しているうちに、頻出っぽい表現があったどんどん追加していきます。
Discussion