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)
。
他のアイデアはありますか?それとも問題へのより良いアプローチですか?
ありがとう!