3
0

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 3 years have passed since last update.

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

Last updated at Posted at 2020-06-30

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

3
0
3

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
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?