Proc.newまたはを使用してインスタンス化された Proc の厳密なアリティ強制を「オン」にして、Kernel.procでインスタンス化された Proc のように動作する方法はありlambdaますか?
私のinitializeメソッドはブロック&actionを取り、それをインスタンス変数に割り当てます。アリティを厳密に強制したいactionので、後で引数を適用するとArgumentError、より意味のある例外をレスキューして発生させることができます。基本的:
class Command
attr_reader :name, :action
def initialize(name, &action)
@name = name
@action = action
end
def perform(*args)
begin
action.call(*args)
rescue ArgumentError
raise(WrongArity.new(args.size))
end
end
end
class WrongArity < StandardError; end
残念ながら、actionデフォルトではアリティを強制しません:
c = Command.new('second_argument') { |_, y| y }
c.perform(1) # => nil
action.to_proc動作しませんlambda(&action)。
他のアイデアはありますか?それとも問題へのより良いアプローチですか?
ありがとう!