【发布时间】:2009-11-27 18:07:23
【问题描述】:
我有一些 ruby 代码要转换为 Ruby 1.9。我收到的一个警告是Hash#index is deprecated; use Hash#key
但是 Hash#key 没有在 Ruby 1.8 中定义,所以我不能直接使用它。有人有好的选择吗?
我有几个选项(我会将它们作为答案发布,以便您投票),但我希望有更好的选择。
【问题讨论】:
我有一些 ruby 代码要转换为 Ruby 1.9。我收到的一个警告是Hash#index is deprecated; use Hash#key
但是 Hash#key 没有在 Ruby 1.8 中定义,所以我不能直接使用它。有人有好的选择吗?
我有几个选项(我会将它们作为答案发布,以便您投票),但我希望有更好的选择。
【问题讨论】:
另一种选择是monkeypatch:
class Hash
alias_method(:key, :index) unless method_defined?(:key)
end
【讨论】:
您还可以反转哈希:
{ :hello => :world }.invert[:world] # ==> :hello
没有猴子补丁或外部依赖,但在大多数情况下可能效率较低。
【讨论】:
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 方法。这使得拥有适用于所有这些平台的代码变得更加容易。
【讨论】:
{:hello => :world}.key(:world),我希望?依靠一个常用的库来猴子补丁可能比在每个库中随机地猴子补丁要好。 OTOH,没有人喜欢添加依赖项。
一种可能性是:
(hash.respond_to?(:key) ? hash.key(t) : hash.index(t))
但这很恶心,而且会增加开销。
【讨论】:
它相当丑陋,但也可以:
h = { :a => 1 }
[:key,:index].find{|method| break h.send(method, 1) if h.respond_to?(method) }
【讨论】: