私は 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
だから私の質問はこれです.ブロックがオーバーライドされたイニシャライザより先に移動しないように、再度呼び出す前にメソッドシグネチャからブロックを削除する方法はありますか?