La création dynamique de classe en Ruby
J'ai une classe qui doit ressembler à quelque chose comme ceci:
class Family_Type1
@people = Array.new(3)
@people[0] = Policeman.new('Peter', 0)
@people[1] = Accountant.new('Paul', 0)
@people[2] = Policeman.new('Mary', 0)
def initialize(*ages)
for i in 0 ... @people.length
@people[i].age = ages[i]
end
end
end
Je veux être en mesure de définir un tas de classes similaires à celui-ci au moment de l'exécution (définir une seule fois au démarrage) où la taille de la matrice et le type attribué à chaque paramètre est défini au moment de l'exécution de l'extérieur de la spécification de fichier.
J'ai réussi à le faire fonctionner à l'aide est évaluée comme mais c'est vraiment laid. Une meilleure façon?
OriginalL'auteur | 2009-02-23
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, une partie de la raison de votre exemple de code qui ne fonctionne pas pour vous, c'est que vous avez deux différents
@people
variables - l'un est un variable d'instance et l'autre est un variable d'instance de classe.Si vous voulez créer des variables une fois dans une classe à utiliser dans les méthodes d'instance de cette classe, l'utilisation
constants
ouclass variables
.Même si, dans le contexte de votre code, vous ne voulez probablement pas à toutes vos instances de Family_Type1 pour désigner la même les Policiers et les experts-Comptables de droite? Ou pensez-vous?
Si nous passons à l'aide de variables de classe:
L'exécution de l'initialisation peut être fait avec la métaprogrammation, comme Chirantan dit, mais si vous ne l'initialisation d'un peu de classes, et vous savez ce que leur nom est, vous pouvez aussi le faire en utilisant simplement ce que vous lisez à partir du fichier:
génial explication , aide à dégager les concepts ...thnks
OriginalL'auteur rampion
De ce que je comprends, vous avez besoin de la méta-programmation. Voici un extrait de code pour la création de classes dynamiquement (à la volée) avec la méthode initialize qui initialise les variables d'instance-
Espère que vous pourrez personnaliser en fonction de vos besoins.
Mec, dans votre cas, vous pouvez le faire instance_variable_set("@params[#{i}].âge", âge[i]) et que vous vous êtes fait... c'est comment vous pouvez traiter avec des tableaux. Vous avez besoin de creuser un peu pour comprendre.
OriginalL'auteur Chirantan
En supposant que vous souhaitez créer différentes classes par type/taille de la matrice au moment de l'exécution:
Si (comme en Python) un Rubis classe est définie lors de l'exécution, (je pense que c'est), alors vous pouvez le faire:
Définir votre classe à l'intérieur d'une fonction. Ont pour fonction de recevoir de la matrice de taille et le type des paramètres et le retour de la classe dans son résultat. De cette façon, vous avez une sorte de fabrique de classe à appeler pour chaque définition dans votre fichier spec 🙂
En revanche, si vous souhaitez initialiser
@params
basées sur des données réelles, gardez à l'esprit que Ruby est un typées dynamiquement de la langue: il suffit de les réaffecter@params
dans votre constructeur de la nouvelle tableau!Dans initialiser je ne veux envoyer la valeur - et non des objets. Permet de dire que la variable d'instance est un tableau de Personne des objets dérivés, alors je veux le tableau avec les types de faire partie de la définition de la classe, et dans initialiser je vais passer uniquement les noms de chaque personne.
OriginalL'auteur Daren Thomas