2010-07-27 6 views
1

J'essaie de créer des instances d'objets de divers types en faisant des itérations et en vérifiant la validité. Je besoin d'un tableau de types pour que je puisse faire quelque chose comme ceci:Tableau de types en Ruby

def tryClasses(in) 
    types = [Foo::A, Foo::B, Foo::C] 

    types.each do |type| 
     a = type.new(in) 
     return a != null 
    end 
end 

Comment créer et tableau de types de classe? En procédant ainsi, je reçois un NoMethodError (méthode non définie « A » pour Foo)

+0

Comment voulez-vous que la fonction se comporte? remplir le tableau et générer des classes fonctionne bien. Voulez-vous qu'il retourne le premier cours où le nouveau a réussi? –

+0

Je viens de réaliser ce que vous voulez dire. Oui, à des fins d'apprentissage je veux juste qu'il retourne true quand il crée une instance valide de A B ou C. – willoller

+0

Qu'est-ce que 'tryClasses (in)' et avec qui 'end' est-il à la fin? –

Répondre

4

Outre les erreurs de syntaxe évidente (par exemple in est un mot Reseved et null est orthographié nil en Ruby), le code que vous montriez devrait fonctionner très bien comme il est, et en effet il le fait lorsque je copie & le coller dans mon installation Ruby. Cela suppose, bien entendu, que les classes Foo::A, Foo::B et Foo::C existent réellement. Si ce n'est pas le cas, le code ne peut évidemment pas fonctionner.

Il est cependant tout à fait non Rubyish et viole à peu près toutes les conventions de codage dans le livre:

  1. indentation est 2 espaces
  2. noms de méthode sont snake_case, pas camelCase
  3. la vérification explicitement égalité à nil est un non-non, appelant simplement #nil? est beaucoup préféré
  4. try_classes n'est pas exactement un nom de méthode révélatrice d'intention
  5. et WTF fait in signifie?
  6. Rubyistes beaucoup préfèrent les méthodes d'ordre supérieur sur explicite boucle

Voici une version plus Rubyish du code que vous avez écrit:

def can_create_object?(*args) 
    [Foo::A, Foo::B, Foo::C].none? do |klass| 
    klass.new(*args).nil? 
    end 
end 

Cependant, notez que je suis assez convaincu que l'idée est fondamentalement imparfait.

+2

lol d'accord - vous m'avez intimidé en réexaminant mes hypothèses initiales. Je serai de retour avec une meilleure question un autre jour! – willoller

Questions connexes