🐕

Ruby初心者が覚えておきたい。Rubyっぽい書き方。

2021/05/29に公開

はじめに

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を勉強しているうちに、頻出っぽい表現があったどんどん追加していきます。

参考文献

プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで

Discussion