2009-11-27 7 views
2

J'ai du code ruby ​​que je convertis en Ruby 1.9. Un avertissement que je reçois est Hash#index is deprecated; use Hash#keyalternatives à Hash # index qui fonctionne sans avertissement à la fois dans Ruby 1.8 et 1.9

Mais la clé Hash # n'est pas définie dans Ruby 1.8, donc je ne peux pas l'utiliser directement. Quelqu'un at-il une bonne alternative?

J'ai quelques options (que je posterai comme réponses pour que vous puissiez voter), mais j'espère mieux.

Répondre

4

Vous pouvez aussi inverser le hachage:

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

Aucun singe ragréage ou de dépendances externes, mais probablement moins efficace pour la plupart des buts.

+0

Un peu tard pour corriger mon code maintenant, mais mes hachages sont petits donc j'aurais probablement utilisé votre réponse. –

0

Une possibilité est:

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

Mais qui est brut et ajoute les frais généraux.

6

Un autre choix est de monkey-patch:

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

Il est plutôt laid, mais fonctionne aussi:

h = { :a => 1 } 
[:key,:index].find{|method| break h.send(method, 1) if h.respond_to?(method) } 
1
require 'backports/1.9.1/hash/key' 
{:hello => :world}.key(:world) # ==> :hello on all ruby versions 

Mon petit bijou backports définit tous Ruby 1.8.7 et beaucoup Ruby 1.9/2.0 méthodes. Cela rend beaucoup plus facile d'avoir du code qui fonctionne sur toutes ces plates-formes.

+0

vous vouliez dire '{: bonjour =>: monde} .key (: monde)', j'espère? S'appuyer sur une bibliothèque communément utilisée pour appliquer un correctif de singe est probablement préférable à la correction aléatoire de singe dans chaque bibliothèque. OTOH, personne n'apprécie les additions supplémentaires. –

+0

Oups, oui, en effet. J'ai réparé ça, merci. Mon but est d'éviter que tout le monde ait du mal à comprendre comment faire des patchs de singe correctement; Je (habituellement) exécute aussi mes implémentations contre rubyspecs ... –

+0

Je vais accepter votre réponse. Je suis allé avec le patch de singe moi-même, mais j'avais d'autres considérations ne figurant pas dans la question. C'est probablement la bonne réponse pour la plupart des autres. –