Comment dois-je appeler une méthode qui est une valeur de hachage?
Auparavant, j'ai demandé un moyen astucieux pour exécuter une méthode sur un problème donné "Ruby un moyen astucieux pour exécuter une fonction d'une condition."
Les solutions et le temps de réponse était grande, bien que, lors de la mise en œuvre, ayant une table de hachage de lambdas devient laid assez rapidement. J'ai donc commencé à expérimenter.
Le code suivant fonctionne:
def a()
puts "hello world"
end
some_hash = { 0 => a() }
some_hash[0]
Mais si je enrober dans une classe, il cesse de fonctionner:
class A
@a = { 0 => a()}
def a()
puts "hello world"
end
def b()
@a[0]
end
end
d = A.new()
d.b()
Je ne vois pas pourquoi il devrait s'arrêter de travailler, quelqu'un peut-il suggérer comment le faire fonctionner?
OriginalL'auteur | 2009-07-01
Vous devez vous connecter pour publier un commentaire.
que le code ne fonctionne pas. il exécute
a
au moment où il est ajouté à la table de hachage, pas quand il est extrait de la table de hachage (essayer dans de la cisr).Il ne fonctionne pas dans la classe, car il n'y a pas de
a
méthode définie dans la classe (on finit par définir une méthodea
sur l'instance.Essayer réellement à l'aide de lambda comme
au lieu
C'est le code de messier dans un lambda qu'il le serait dans une méthode?
ensuite transmettre à la méthode noms, symboles et l'utilisation d'envoyer ou de Symbole#to_proc.
il serait identique, mais d'emballage le code dans les méthodes alors leur référencement dans la table de hachage semble plus belle solution.
avez-vous envisagé la création d'une méthode de classe qui pourrait prendre un bloc et l'ajouter comme un lambda de votre hash et puis il suffit de l'utiliser comme nécessaire dans votre corps de classe.
OriginalL'auteur Ben Hughes
Tout d'abord, vous ne sont pas de mettre un lambda dans la table de hachage. Vous êtes de mettre le résultat de l'appel d'
a()
dans le contexte actuel.Compte tenu de cette information, pensez à ce que le code dans votre classe. Le contexte de la définition d'une classe est la classe. Si vous définissez une méthode d'instance appelée
a
, et affecter une variable d'instance de classe à une table de hachage contenant le résultat de l'appela
dans le contexte actuel. Le contexte actuel est la classe A, la classe A n'est pas une méthode de classe appeléa
, si vous essayez de mettre le résultat d'une méthode inexistante là. Ensuite, dans la méthode d'instanceb
, vous essayez d'accéder à une variable d'instance appelée@a
- mais il n'en est pas une. Le@a
définie dans la classe appartient à la classe elle-même, pas un cas particulier.Alors tout d'abord, si vous voulez un lambda, vous avez besoin de faire un lambda. Deuxièmement, vous devez être clair sur la différence entre une classe et une instance de cette classe.
Si vous voulez faire une liste de noms de méthode doit être appelée à certaines conditions, vous pouvez le faire comme ceci:
Ce définit les conditions de hachage comme une méthode de la classe (ce qui la rend facile d'accès), et la valeur de hachage contient simplement le nom de la méthode à appeler plutôt qu'un lambda ou quelque chose comme ça. Ainsi, lorsque vous appelez
b(0)
, ilsend
s lui-même le message contenu dans A. conditions[0], qui esta
.OriginalL'auteur Chuck
OriginalL'auteur wiki
Si vraiment vous voulez juste assez pour ce genre de chose en place,
pourquoi ne pas l'emballage de tous vos méthodes dans une classe comme ceci:
ou, pour reprendre votre exemple:
Une autre erreur de base que vous faite, c'est que vous avez initialisé
@a
en dehors de toute méthode d'instance -juste nu à l'intérieur de la définition de
A
. C'est un gros no-no, parce que cela ne fonctionne tout simplement pas.Rappelez-vous, en ruby, tout est un objet, y compris les classes, et les
@
préfixe signifie l'instancevariable de tout objet en soi. À l'intérieur d'une méthode d'instance définitions,
self
est une instancede la classe. Mais en dehors de cela, juste à l'intérieur de la définition de la classe,
self
est la classe de l'objet, de sorte que vous avez définiune variable d'instance nommée
@a
pour la classe de l'objetA
, qu'aucun cas deA
pouvez obtenir directement.Ruby a une raison à ce comportement (les variables d'instance de classe peut être très pratique si vous savez ce que
vous êtes en train de faire), mais c'est une technique plus avancée.
En bref, seuls les initialiser les variables d'instance dans le
initialize
méthode.OriginalL'auteur rampion
Bien, la première ligne de votre classe, qui appelle une méthode qui n'existe pas encore. Il ne sera même pas exister après l'ensemble de la classe est chargée, depuis que ce serait un appel à la méthode de la classe et que vous avez défini des méthodes d'instance.
Aussi garder à l'esprit que {0 => a()} va appeler la méthode a(), pas de créer une référence à la méthode a(). Si vous voulais mettre une fonction qui n'est pas évalué à plus tard, vous auriez à utiliser une certaine forme de Lambda.
Vous pourriez faire quelque chose comme ceci: @a = {0 => lambda{A. de nouveaux.un()}} Ensuite, vous avez à appeler avec @a[0].appel
OriginalL'auteur Phil Kulak
Je suis assez nouveau à l'aide de rappels en Ruby et c'est ainsi que je vous l'ai expliqué à moi-même à l'aide d'un exemple:
OriginalL'auteur Saurabh Hirani
OriginalL'auteur Arrow