Comment un parent peut-il obtenir les arguments du constructeur d'un enfant?
a = A.new('hello', 'world')
a.print_args
=> "hello world"
b = B.new('hello')
b.print_args
=> "hello"
3 Réponses :
Si votre module est inclus dans de nombreuses classes et que vous souhaitez afficher variable d'instance A> Valeurs Space séparées, vous pouvez alors faire comme suit, en utilisant uniquement Ruby, P> def print_args
instance_values.values.join(' ')
end
C'est dangereux car il prendra toutes les variables d'instance. Je pense que nous devrions cesser d'aider à travailler comme il ne semble pas clair. fermez plutôt la question.
@Aruprakshit J'ai effacé une idée avant de fournir du code, il affichera toutes les variables d'instance et ne pas nuire à une autre catégorie qui inclura ce module.
C'est 100% de mauvais code de conception. Au lieu de répondre à cela, demandez à OP penser différemment . Et l'OP est totalement gênant, alors je ne suis pas intéressé à lui enseigner. Il sent qu'il sait tout encore il a besoin de demander. J'évite personnellement de tels candidats
Utilisation de instance_variables code> / instance_values code> supprimez les noms d'argument de parent code> comme demandé par l'OP. Mais il faut toujours que les "enfants" soient mis en œuvre de manière très spécifique: chaque argument à initialiser code> doit être stocké dans une variable d'instance (dans l'ordre donné) et il ne doit y avoir aucune autre variables d'instance. afin d'avoir cette méthode fonctionner. C'est très restrictif imo.
Un moyen est d'avoir les "enfants" implémenter une méthode qui renvoie leurs arguments: le "parent" peut appeler cette méthode sans avoir à connaître sa mise en œuvre: P > module Parent
def print_args
puts args.join(' ')
end
end
J'ai utilisé instance_values code> au lieu de la définition de la méthode args code>. Sera-t-il différer pour un cas majeur ou quelque chose me manque?
@ray instance_values code> est une carte générique, mais args code> n'est pas. Avec args code> vous maintenez toujours un contrôle qui est bon.
@ray qu'est-ce que instance_values code>?
Oui cette méthode de rails, et c'est une question rubis.
Vous demandez comment obtenir les "Arguments du constructeur du parent" em> et depuis presque tout est possible dans Ruby: Si vous êtes vraiment aventureux (lire: ne le faites pas), Vous pouvez remplacer le exemple d'utilisation: p> Nouveau code> méthode sur parent code> afin d'intercepter ses arguments et de définir une méthode singleton sur l'instance qui imprime l'argument: class A
include Parent
def initialize(foo, bar)
end
end
A.new('hello', 'world').print_args
# prints "hello world"
"# {@ foo} # {@ bar}" code>?voir ma question mise à jour
@Xero Vous faites maintenant votre question vague. Veuillez apprendre comment fonctionne le module dans Ruby. Vous devez concevoir et apprendre à vos classes comment ils doivent interagir. Le code n'est pas magique, mais une intention d'être humain de résoudre quelque chose.
"Veuillez apprendre comment fonctionne le module" n'est pas une réponse valable. Je sais comment ça marche. Mais si je manque quelque chose, s'il vous plaît dites-moi
@Xero Vous ne semble pas idée de savoir comment cela fonctionne vraiment, car vous attendez
print_args code> doit imprimer des données de la classe pendant qu'elle ne devrait pas savoir aucun détail de ces classes qui les incluront. Vous attendez une magie, mais ce n'est pas une magie. Vous devez créer une dépendance. Votreprint_args code> est une méthode abstraite, si vous ne voulez pas savoir si vous connaissez les détails de la classe, puis remplacez-le à l'intérieur des classes y compris.voir @ray répondre
@Xero j'ai vu, ce n'est pas une réponse. Si vous êtes heureux, allez-y, et acceptez-le.