Hash #index的替代品在Ruby 1.8和1.9中都没有警告

时间:2009-11-27 18:07:23

标签: ruby ruby-1.9

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

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

我有几个选项(我会将其作为答案发布,以便您可以投票),但我希望能有更好的选择。

5 个答案:

答案 0 :(得分:6)

另一个选择是monkeypatch:

class Hash
  alias_method(:key, :index) unless method_defined?(:key)
end

答案 1 :(得分:4)

你也可以反转哈希:

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

没有猴子修补或外部依赖,但在大多数情况下可能效率较低。

答案 2 :(得分:1)

require 'backports/1.9.1/hash/key'
{:hello => :world}.key(:world)  # ==> :hello on all ruby versions

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

答案 3 :(得分:0)

一种可能性是:

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

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

答案 4 :(得分:0)

它相当丑陋,但也有效:

h = { :a => 1 }
[:key,:index].find{|method| break h.send(method, 1) if h.respond_to?(method) }