【问题标题】:alternatives to Hash#index that works without warning in both Ruby 1.8 and 1.9在 Ruby 1.8 和 1.9 中无警告地工作的 Hash#index 的替代品
【发布时间】: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


    【解决方案1】:

    另一种选择是monkeypatch:

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

    【讨论】:

      【解决方案2】:

      您还可以反转哈希:

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

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

      【讨论】:

      • 现在修复我的代码有点晚了,但我的哈希值很小,所以我可能会使用你的答案。
      【解决方案3】:
      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,没有人喜欢添加依赖项。
      • 哎呀,是的,确实如此。我修好了,谢谢。我的目标是避免每个人都在弄清楚如何正确修补东西的麻烦;我(通常)也针对 ruby​​specs 运行我的实现......
      • 我会接受你的回答。实际上,我自己使用了猴子补丁,但我还有其他未在问题中列出的注意事项。这可能是大多数其他人的正确答案。
      【解决方案4】:

      一种可能性是:

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

      但这很恶心,而且会增加开销。

      【讨论】:

        【解决方案5】:

        它相当丑陋,但也可以:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-22
          • 1970-01-01
          • 2010-09-06
          相关资源
          最近更新 更多