1

Je le code suivant:Dynamiquement créer la classe

module City 
    class Bus < Base 
    end 

    class BusOne < Bus; end 
    class BusTwo < Bus; end 
    class BusSixty < Bus; end 
    .... 
end 

Mon but est de créer cette classe dynamique:

class BusOne < Bus; end 
    class BusTwo < Bus; end 
    class BusSixty < Bus; end 
    ... 

Voilà pourquoi j'ai essayé:

module City 
    class Bus < Base 
    DIVISON = [:one, :two, :sixty] 
    end 

    .... 
    Bus::DIVISONS.each do |division| 
    class "Bus#{division.capitalize}".constantize < Bus; end 
    end 
end 

Mais je reçois cette erreur:

unexpected '<', expecting &. or :: or '[' or '.' (SyntaxError) 

Que dois-je tort? Merci

+0

Je pense que votre réponse mérite le greenie. Le mien est juste une variante. –

Répondre

0

C'est une variante de la réponse de John, principalement pour montrer l'utilisation de send n'est pas indispensable.

module City 
    class Bus 
    def i_am 
     puts "this is class #{self.class}" 
    end 
    end 
end 

["BusOne", "BusTwo", "BusSixty"].each do |class_name| 
    City.const_set(class_name, Class.new(City::Bus)) 
end 

City::BusOne.new.i_am 
this is class City::BusOne 

City::BusTwo.new.i_am 
this is class City::BusTwo 

City::BusSixty.new.i_am 
this is class City::BusSixty 
1

Fonctionne avec:

City.send(:const_set, "Bus#{division.capitalize}", Class.new(Bus))