【问题标题】:Dynamically create class [duplicate]动态创建类[重复]
【发布时间】:2017-10-04 16:54:12
【问题描述】:

我有以下代码:

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)

我做错了什么? 谢谢

【问题讨论】:

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

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-5


【解决方案1】:

这是约翰答案的变体,主要是为了表明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

【讨论】:

    【解决方案2】:

    适用于:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-29
      • 2017-04-17
      • 1970-01-01
      • 2021-12-07
      • 2013-05-05
      • 1970-01-01
      • 1970-01-01
      • 2016-01-24
      相关资源
      最近更新 更多