1

我有以下代码:动态创建类

module City 
    class Bus < Base 
    end 

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

我的目标是动态创建这个类:

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

这就是为什么我想:

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

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

但我得到这个错误:

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

什么我错了吗? 感谢

+0

我认为你的答案值得绿党。我的只是一个变种。 –

回答

0

这是约翰的回答的一个变种,主要是为了展示使用send不是必需的。

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

作品有:

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