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
https://docs.ruby-lang.org/ja/latest/class/Object.html
もし他に「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
あわせて読みたい
そもそも変数名を省略しすぎるとそれだけで可読性を落とす恐れがあります。
この問題についてはこちらのブログで説明しています。