Comment puis-je convertir des clés de hachage pour les noms de méthode?
C'est mon hash:
tempData = {"a" => 100, "here" => 200, "c" => "hello"}
J'ai besoin d'accéder aux clés de hachage comme une méthode comme:
tempData.a #100
tempData.here # 200
- Quel est le problème avec la normale de l'accesseur?
- nous pouvons accéder à la façon traditionnelle, je suis juste curieux de savoir à ce sujet 🙂
Vous devez vous connecter pour publier un commentaire.
Vous pourriez juste envelopper de votre hachage dans un OpenStruct:
Si vous avez vraiment vraiment voulu, vous pouvez également singe-patch le
Hash
classe, mais je vous le déconseille qu':Mise à jour: Dans mon personnels de la bibliothèque d'extensions j'ai ajouté un Dièse#to_ostruct méthode. Ce sera de manière récursive convertir un hachage dans un
OpenStruct
y compris tous imbriqués les tables de hachage.OpenStruct
gère l'ensemble de sa mise en œuvre initiale, mais pas imbriquée hachages que la version qu'il a posté dans les commentaires.Il y a une autre façon de le faire.
JSON.parse(tempData.to_json, object_class: OpenStruct)
qui donnera objet
#<OpenStruct a=100, here=200, c="hello">
De cette façon imbriquée
hash
aussi seront convertis enOpenStruct Object
Maintenant nous sommes en mesure d'appeler
Espère que cela aidera quelqu'un.
Sinon, si c'est juste un petit script, il peut être plus commode de simplement étendre
Hash
lui-mêmemethod_missing
est une méthode magique qui est appelée à chaque fois que votre code tente d'appeler une méthode qui n'existe pas. Ruby va intercepter l'échec d'appel au moment de l'exécution et de vous permettre de gérer votre programme peut récupérer gracieusement. La mise en œuvre ci-dessus tente d'accéder à la valeur de hachage en utilisant le nom de la méthode comme un symbole, l'un avec le nom de méthode comme une chaîne de caractères, et finalement échoue avec Ruby intégré dans la méthode d'erreur manquant.Si le hachage est à l'intérieur d'un module, vous pouvez définir des méthodes sur ce module (ou classe) de manière dynamique à l'aide de
define_method
. Par exemple:Cela permettra de définir un
Version
module avecmajor
,minor
, etpatch
méthodes qui retournent des 1, 2, et 3, respectivement.vous pouvez étendre la classe Hash de la manière suivante.