2

我有一些要转换为 Ruby 1.9 的 ruby​​ 代码。我得到的一个警告是Hash#index is deprecated; use Hash#key

但是 Hash#key 没有在 Ruby 1.8 中定义,所以我不能直接使用它。有人有好的选择吗?

我有几个选项(我将把它们作为答案发布,以便你投票),但我希望有更好的选择。

4

5 回答 5

6

另一种选择是monkeypatch:

class Hash
  alias_method(:key, :index) unless method_defined?(:key)
end
于 2009-11-27T18:10:59.747 回答
4

您还可以反转哈希:

{ :hello => :world }.invert[:world]    # ==> :hello

没有猴子补丁或外部依赖,但对于大多数用途来说可能效率较低。

于 2012-07-01T21:28:11.617 回答
1
require 'backports/1.9.1/hash/key'
{:hello => :world}.key(:world)  # ==> :hello on all ruby versions

我的反向移植gem 定义了所有 Ruby 1.8.7 和许多 Ruby 1.9 / 2.0 方法。这使得拥有适用于所有这些平台的代码变得更加容易。

于 2009-11-27T22:04:02.580 回答
0

一种可能性是:

(hash.respond_to?(:key) ? hash.key(t) : hash.index(t))

但这很糟糕,并且增加了开销。

于 2009-11-27T18:07:57.633 回答
0

它相当丑陋,但也有效:

h = { :a => 1 }
[:key,:index].find{|method| break h.send(method, 1) if h.respond_to?(method) }
于 2009-11-27T18:20:54.237 回答