10
votes

Dans Ruby, comment obtenir des variables d'instance dans un hachage au lieu d'un tableau?

J'ai une classe de rubis. Je veux obtenir une variable d'instance d'un argument à une méthode de cette classe. Je peux faire toutes les variables d'instance en tant que tableau: xxx

Cependant, je veux obtenir la variable d'instance nommée arg , spécifiquement: < Pré> xxx

Comment calculer hash_of_instance_variables ?


2 commentaires

Peux-tu élaborer? Votre question n'est pas très claire.


On dirait que vous espérez construire un hachage qui mesure des variables d'instance sur leurs valeurs afin que vous puissiez récupérer la valeur de la variable d'instance. Si oui, pourquoi? Utilisez instance_variable_get .


4 Réponses :


1
votes
class MyClass    
def variables_to_hash
      h = {}
      instance_variables.each{|a|
        s = a.to_s
        n = s[1..s.size]
        v = instance_variable_get a
        h[n] = v
      }
      h
    end
end

1 commentaires

Notez que s [1...Size] peut être remplacé par s [1 ..- 1] .



23
votes

Pour créer un hachage de toutes les variables d'instance Vous pouvez utiliser le code suivant:

object.instance_variable_get :@my_instance_var


0 commentaires

10
votes

Question est une solution assez ancienne mais trouvée des rails pour cela: instance_values ​​

Ceci est la première réponse dans Google afin que cela aidera peut-être quelqu'un.


3 commentaires

Merci d'avoir aidé la communauté. Je n'utilise plus Ruby / Rails, passés à Node.js. Meilleurs


Le code utilisé par les rails est presque identique à la réponse acceptée à l'exception de l'exception que Rails lance le principal @ .


instance_values ​​ a travaillé pour moi et était plus simple. Merci! (maintenant testé avec des rails 6)



-1
votes

Ruby On Rails a un couple de façons intégrées de faire cela que vous pourriez trouver répondre à vos besoins.

utilisateur = utilisateur.new (premier: 'Brian', dernier: "cas")


1 commentaires

Ceci s'applique uniquement aux modèles de rails (instances de activerecord :: base ). Pour un objet Ruby arbitraire, @ Réponse de SUFLER fonctionne.