альтернативы Hash # index, который работает без предупреждения в Ruby 1.8 и 1.9 - PullRequest
2 голосов
/ 27 ноября 2009

У меня есть какой-то рубиновый код, который я конвертирую в Ruby 1.9. Одно предупреждение я получаю Hash#index is deprecated; use Hash#key

Но ключ Hash # не определен в Ruby 1.8, поэтому я не могу использовать это напрямую. У кого-нибудь есть хорошая альтернатива?

У меня есть несколько вариантов (которые я опубликую как ответы, чтобы вы могли голосовать), но я надеюсь на лучшее.

Ответы [ 5 ]

6 голосов
/ 27 ноября 2009

Другой вариант - обезьяна:

class Hash
  alias_method(:key, :index) unless method_defined?(:key)
end
4 голосов
/ 02 июля 2012

Вы также можете инвертировать хеш:

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

Никаких мартышек или внешних зависимостей, но, вероятно, менее эффективно для большинства целей.

1 голос
/ 28 ноября 2009
require 'backports/1.9.1/hash/key'
{:hello => :world}.key(:world)  # ==> :hello on all ruby versions

My backports gem определяет все Ruby 1.8.7 и многие методы Ruby 1.9 / 2.0. Это значительно облегчает создание кода, который работает на всех этих платформах.

0 голосов
/ 27 ноября 2009

Это довольно некрасиво, но тоже работает:

h = { :a => 1 }
[:key,:index].find{|method| break h.send(method, 1) if h.respond_to?(method) }
0 голосов
/ 27 ноября 2009

Одна возможность:

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

Но это грубо и добавляет накладных расходов.

...