动态创建一个类

BSG*_*BSG 17 ruby attributes class dynamic

我正在尝试创建一个新类,不知道该类的名称,直到它应该创建.

像这样的东西;

    variable = "ValidClassName"

        class variable

        end

Test = ValidClassName.new
Run Code Online (Sandbox Code Playgroud)

如果可能的话,我也会欣赏有关如何动态地向这个新类添加属性(和方法)的提示.

我将为课程检索"设置",它们看起来像这样:

title :Person
attribute :name, String
attribute :age, Fixnum
Run Code Online (Sandbox Code Playgroud)

但不应将其设计为仅接受该显式文件,这些属性的数字结尾类型可能不同.

最终会产生一个看起来像这样的类:

class Person
   def initialize(name, age)

       @name_out = name
       @age_out = age
   end

end
Run Code Online (Sandbox Code Playgroud)

救命?

Mar*_*une 28

将类分配给常量时,类会获得其名称.所以用通用方式很容易做到const_set.

例如,假设您要使用Struct构建具有某些属性的类,您可以:

name = "Person"
attributes = [:name, :age]

klass = Object.const_set name, Struct.new(*attributes)
# Now use klass or Person or const_get(name) to refer to your class:
Person.new("John Doe", 42) # => #<struct Person name="John Doe", age=42>
Run Code Online (Sandbox Code Playgroud)

为了从另一个类继承,更换Struct.newClass.new(MyBaseClass),说:

class MyBaseClass; end

klass = Class.new(MyBaseClass) do
  ATTRIBUTES = attributes
  attr_accessor *ATTRIBUTES
  def initialize(*args)
    raise ArgumentError, "Too many arguments" if args.size > ATTRIBUTES.size
    ATTRIBUTES.zip(args) do |attr, val|
      send "#{attr}=", val
    end
  end
end
Object.const_set name, klass
Person.new("John Doe", 42) # => #<Person:0x007f934a975830 @name="John Doe", @age=42> 
Run Code Online (Sandbox Code Playgroud)


Dan*_*man 9

您的代码看起来类似于此:

variable = "SomeClassName"
klass = Class.new(ParentClass)
# ...maybe evaluate some code in the context of the new, anonymous class
klass.class_eval {  }
# ...or define some methods
klass.send(:title, :Person)
klass.send(:attribute, :name, String)
# Finally, name that class!
ParentClass.send(:const_set, variable, klass)
Run Code Online (Sandbox Code Playgroud)

...或者您可以使用eval:

eval <<DYNAMIC
  class #{name}
    title :Person
    attribute :name, String
    # ...or substitute other stuff in here.
  end
DYNAMIC
Run Code Online (Sandbox Code Playgroud)

  • 对不起,我真的不在这里.你能不能试着解释一下好像我三岁了?:p (2认同)