有没有办法“打开”使用Proc.new
or实例化的 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)
。
还有其他想法吗?还是解决问题的更好方法?
谢谢!