Ruby 如何处理Class.new的可选参数

Ruby 如何处理Class.new的可选参数,ruby,Ruby,我使用class.new方法创建了一个动态类。但有时我调用带有参数的方法来创建继承的类,有时不调用 备选案文1: newclass = Class.new do ... end 备选案文2: newClass = Class.new(p) do ... end 新类的主体是相同的。但是我不能用未定义的p调用Class.new(p)。因此,我必须创建一个if语句,然后调用Class.new(带参数或不带参数),这意味着我有用于创建类的重复代码,这并不理想,因为我的代码每次更改都必须进行

我使用
class.new
方法创建了一个动态类。但有时我调用带有参数的方法来创建继承的类,有时不调用

备选案文1:

newclass = Class.new do
  ...
end
备选案文2:

newClass = Class.new(p) do
  ...
end

新类的主体是相同的。但是我不能用未定义的
p
调用
Class.new(p)
。因此,我必须创建一个if语句,然后调用
Class.new
(带参数或不带参数),这意味着我有用于创建类的重复代码,这并不理想,因为我的代码每次更改都必须进行两次。有什么办法可以解决这个问题吗?

你可以抽象
类。new
调用并将块放在一个地方。大概是这样的:

def create_me_a_class(superklass = Object, &block)
  Class.new(superklass, &block)
end

newclass = create_me_a_class(p) do
  def my_method
    # whatever
  end
end

仅供参考,这个问题与rails无关。只是ruby。@SergioTulentsev只有OP的名字听起来像是rails。以前被标记为rails…标记已被删除。我建议默认设置
可能的\u superclass=Object
,因为w/o params Class.new创建了一个继承自
Object
类的类。所以,我们可以去掉
if
语句。@nattfodd:同意。自信代码,称为:)尽管在升级ruby时,默认超类发生变化的可能性很小。不确定是否值得担心。嗨,太好了!如果我指定可能的_superclass=Object,它就完成了任务!我可以用它的父对象调用Class.New,或者调用另一个类,它就可以工作了。谢谢@迈克尔:这是
Class.new
btw,不是
Class.new
。这是非常重要的。也许你也知道如何解决第二个问题。这个新类包括include Mongoid::Document include Mongoid::Attributes::Dynamic