我正在使用 ActiveAttr,它通过块选项为您提供了很好的初始化:
person = Person.new() do |p|
p.first_name = 'test'
p.last_name = 'man'
end
但是,在包含 ActiveAttr::Model 的特定类中,我想绕过此功能,因为我想将该块用于其他用途。所以我们开始:
class Imperator::Command
include ActiveAttr::Model
end
class MyCommand < Imperator::Command
def initialize(*args, &block)
@my_block = block
super(*args)
end
end
这惨遭失败,因为块仍然被传递到链上,最终在 ActiveAttr 内部,这段代码被运行:
def initialize(*)
super
yield self if block_given?
end
所以如果我的电话看起来像这样:
MyCommand.new() { |date| date.advance(month: 1) }
它失败如下:
NoMethodError: undefined method `advance' for #<MyCommand:0x007fe432c4fb80>
由于 MyCommand 没有方法 :advance 它,因此对 MyCommand 的调用显然失败了。
所以我的问题是,有没有一种方法可以在我super
再次调用之前从方法签名中删除该块,以便该块不会比我重写的初始化程序更远?