45 votes

hash ['key'] vers hash.key en Ruby

J'ai un hachage

 foo = {'bar'=>'baz'}
 

Je voudrais appeler foo.bar #=> 'baz'

Ma motivation est de réécrire une requête activerecord dans une requête SQL brute (en utilisant le modèle # find_by_sql). Cela renvoie un hachage avec les valeurs de la clause SELECT comme clés. Cependant, mon code existant repose sur la notation par points object.method. J'aimerais faire une réécriture minimale du code. Merci.

Edit: il apparaît que Lua a cette fonctionnalité:

 point = { x = 10, y = 20 }   -- Create new table
print(point["x"])            -- Prints 10
print(point.x)               -- Has exactly the same meaning as line above
 

81voto

Hooopo Points 891
>> require 'ostruct'
=> []
>> foo = {'bar'=>'baz'}
=> {"bar"=>"baz"}
>> foo_obj = OpenStruct.new foo
=> #<OpenStruct bar="baz">
>> foo_obj.bar
=> "baz"
>>

35voto

Avdi Points 13086

Ce que vous recherchez s'appelle OpenStruct . Cela fait partie de la bibliothèque standard.

22voto

Gabor Garami Points 639

Une bonne solution:

 class Hash
  def method_missing(method, *opts)
    m = method.to_s
    if self.has_key?(m)
      return self[m]
    elsif self.has_key?(m.to_sym)
      return self[m.to_sym]
    end
    super
  end
end
 

Remarque: cette implémentation n'a qu'un seul bug connu:

 x = { 'test' => 'aValue', :test => 'bar'}
x.test # => 'aValue'
 

Si vous préférez les recherches de symboles plutôt que les recherches de chaînes, alors permutez les deux conditions «si»

6voto

daf Points 5180

Plutôt que de copier tous les produits de la table de hachage, vous pouvez simplement ajouter un peu de comportement de Hachage pour faire des recherches.

Si vous ajoutez cette définition, vous étendez de Hachage pour gérer tous les inconnus méthodes de hachage recherches:

class Hash
  def method_missing(n)
    self[n.to_s]
  end
end

Gardez à l'esprit que cela signifie que vous ne voyez toujours des erreurs si vous appelez la méthode incorrecte sur la table de hachage, il vous suffit de faire quel que soit le hash de recherche serait de retour.

Vous pouvez considérablement réduire le débogage des problèmes qu'il peut causer en seulement mettre la méthode sur un spécifique de hachage ou, comme beaucoup de hachages que vous avez besoin:

a={'foo'=>5, 'goo'=>6}
def a.method_missing(n)
   self[n.to_s]
end

L'autre observation est que, lorsque l' method_missing est appelée par le système, il vous donne un Symbol argument. Mon code converti en String. Si vos clés de hachage ne sont pas des chaînes de ce code ne sera jamais le retour de ces valeurs - si vous saisissez par des symboles à la place de chaînes de caractères, il suffit de substituer n pour n.to_s - dessus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X