【Ruby】Hash#has_key? がまた一歩、公式のdeprecatedに近づいた?


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 にする気があるのなら、早々に引導を渡してほしいと思う今日この頃です。