Hash#has_key?
は、Matz さんから、
"has_key" has already been deprecated by "key?"
と宣告されて早8年、いろんな Style guide で、 deprecated
だと指摘されています。例えば、
しかし、公式には、Hash#has_key?
は今なお、Hash#include?
や Hash#key?
、Hash#member?
を抑えて、唯一サンプルコードで用いられているメソッドであり、全く deprecated
さを感じさせない活躍ぶりです。
日本語版はこんな感じで、
p({1 => "one"}.has_key?(1)) #=> true
p({1 => "one"}.has_key?(2)) #=> false
英語版は、こんな感じです。
h = { "a" => 100, "b" => 200 }
h.has_key?("a") #=> true
h.has_key?("z") #=> false
しかし、これも Ruby 2.7 までのことで、Ruby 2.8 からは、サンプルコードでの活躍をほかのメソッドに譲り渡すことになりそうです。
GitHub に上がっている最新のコメントはこうなっています。
/*
* call-seq:
* hash.include?(key) -> true or false
* hash.has_key?(key) -> true or false
* hash.key?(key) -> true or false
* hash.member?(key) -> true or false
* Methods #has_key?, #key?, and #member? are aliases for \#include?.
*
* Returns +true+ if +key+ is a key in +self+, otherwise +false+:
* h = {foo: 0, bar: 1, baz: 2}
* h.include?(:bar) # => true
* h.include?(:nosuch) # => false
*
Hash#include?
一押しって感じですね。とはいえ、Hash#has_key?
はまだ2番手につけています。
個人的には、Hash#has_key?
に愛着を感じており、書き捨てのコードなどでは今でも Hash#has_key?
を使うことがあります。
いまだ公式には deprecated
宣言されていない(ですよね?)Hash#has_key?
を使い続けていいものやら、それとも、心を鬼にして Hash#key?
など他のメソッドを使うべきなのか? 心が揺れ動きます。
本当に deprecated
にする気があるのなら、早々に引導を渡してほしいと思う今日この頃です。