-3
votes

Arguments de constructeur d'enfants du parent

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"


7 commentaires

"# {@ foo} # {@ bar}" ?


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 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. Votre print_args 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.


3 Réponses :


1
votes

4 commentaires

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 / instance_values ​​ supprimez les noms d'argument de parent 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 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.



3
votes

Un moyen est d'avoir les "enfants" implémenter une méthode qui renvoie leurs arguments: xxx pré>

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


4 commentaires

J'ai utilisé instance_values ​​ au lieu de la définition de la méthode args . Sera-t-il différer pour un cas majeur ou quelque chose me manque?


@ray instance_values ​​ est une carte générique, mais args n'est pas. Avec args vous maintenez toujours un contrôle qui est bon.


@ray qu'est-ce que instance_values ​​?


Oui cette méthode de rails, et c'est une question rubis.



1
votes

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 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: xxx pré>

exemple d'utilisation: p>

class A
  include Parent

  def initialize(foo, bar)
  end
end

A.new('hello', 'world').print_args
# prints "hello world"


0 commentaires