コモディティ化するエンジニア

組み込み系のSI屋から、Railsを扱うWeb系のベンチャーに転職した筆者が、日々ミジンコなりに情報を綴るブログ。

Hash.include? と Array.include?

最近見たコードの中で、「わかりづらいなー」と思ったことがあったのでメモとして残しておきます。
タイトルの通り、Hash.include?Array.include?は紛らわしいというお話です。

こんな感じのコードがあったとします。

#..(前略)...
foo = { key_a: 'Hello', key_b: 'World' }
bar = ['Hello', 'World']
puts foo.include?(foo_param) # -> ???
puts bar.include?(bar_param) # -> ???

説明用に書いたソースなので、何したいか意味不明な感じですが……
Rubyの文法に明るくない自分はここだけ読んで、
「あー、xxx_param って文字列がvalueに含まれているか確認したいんだな」
と思ったわけです。
ですが、Hash.include?は実は、引数指定したkeyがあるかの真偽を返すメソッドです。
ですので、仮に以下のようなfoo_parambar_paramになっていた場合、

foo_param = 'Hello'
bar_param = 'Hello'
foo = { key_a: 'Hello', key_b: 'World' }
bar = ['Hello', 'World']
#...........
#...(中略)...
#...........
puts foo.include?(foo_param) # -> ???
puts bar.include?(bar_param) # -> ???

putsの結果はこうなります。

false
true

何が言いたいかというと、
Hash.include? ではなく、Hash.has_key?を使って欲しかった。」
foobarとか、型推測しづらい命名は避けて欲しかった。」
です。

でも、元はと言えば、Rubyの文法知識が乏しい自分が悪いか……。
がんばろ。精進しよ。