15
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

RubyAdvent Calendar 2022

Day 1

Rubyではpという変数名をなるべく避ける

Last updated at Posted at 2022-12-14

Rubyプログラミングの小ネタです。

Rubyに限らずプログラミング全般の慣習として、寿命の短い変数の場合、意図的にそのオブジェクトを表す名前の頭文字1文字だけにすることがよくあります。

books.map { |b| b.title }

しかし、Rubyではその場合でもpだけはなるべく使わない方が良いです。

# 問題なく動くがあまり望ましくない
people.map { |p| p.name }

それはなぜか?Kernel.#pメソッドと名前が被ってしまうからです。

もしデバッグでpメソッドを使いたくなったりすると、途端にコードがわかりにくくなります。

# pメソッドでp.nameをターミナルに表示する(?)
people.map { |p| p p.name }

Rubyは懐が深い言語なので、実は上のコードもちゃんと動きます。
気になる方は以下のコードをirbにコピペしてみてください。

class Person
  def name = 'Alice'
end
people = [Person.new]
people.map { |p| p p.name } #=> "Alice"

とはいえ、決して読みやすいコードではないので、最初からp以外の変数名を検討した方が良いと思います。

# あえてpという変数名を避ける
people.map { |person| p person.name }

p以外にも避けるべき1文字の変数名は何かある?

いえ、僕が調べた限り、pだけだと思います。
KernelモジュールやObjectクラスにはp以外の1文字メソッドは定義されていません(2文字のメソッドとしてはppがありますが)。

https://docs.ruby-lang.org/ja/latest/class/Kernel.html
Screen Shot 2022-12-15 at 8.47.28.png

https://docs.ruby-lang.org/ja/latest/class/Object.html
Screen Shot 2022-12-15 at 8.48.30.png

もし他に「RubyやRailsを使う場合はこんな1文字メソッドにも注意が必要だよ」という情報を知っている方がいたら、コメント欄等で教えてください!

hashも避けた方がいいかもしれない

(2023.1.4追記)
1文字ではありませんが、Objectクラスにはhashメソッドが定義されているので、hashという変数名もなるべく避けた方がいいかもしれません。
まあ、hashメソッド自体を使う機会はそれほど多くないと思いますが。。。

# Rubyではhashメソッドが元から定義されている
hash
#=> -3904717994781455203

# hashという変数を定義すると変数が優先的に参照される
hash = {}
hash
#=> {}

# ()やself.を付けるとhashメソッドが呼び出せる
hash()
#=> -3904717994781455203
self.hash
#=> -3904717994781455203

あわせて読みたい

そもそも変数名を省略しすぎるとそれだけで可読性を落とす恐れがあります。
この問題についてはこちらのブログで説明しています。

15
1
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?