有没有办法“打开”使用Proc.newor实例化的 Proc 的严格数量强制Kernel.proc,以便它的行为类似于用 实例化的 Proc lambda?
我的initialize方法需要一个块&action并将其分配给一个实例变量。我想action严格执行 arity,因此当我稍后对其应用参数时,它会引发一个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默认情况下不强制执行arity:
c = Command.new('second_argument') { |_, y| y }
c.perform(1) # => nil
action.to_proc行不通,也不行lambda(&action)。
还有其他想法吗?还是解决问题的更好方法?
谢谢!