1

假设我有,

use experimental 'signatures';
sub foo ($bar) { return 0 };

现在,如果我在没有正确的情况下调用它arity,我会得到一个错误。

# Too few arguments for subroutine 'main::foo'
foo()
# Too many arguments for subroutine 'main::foo'
foo(1,2);

但是,我该如何测试。假设我想确保有人实现了一个package Bar这样的函数,它的函数foo需要一个参数。有没有办法在不运行该代码的情况下做到这一点。


我认为这个问题与我的其他问题不同,因为即使我无法通过某种 Perl API 读取签名,也可能有一种方法可以测试子例程是否使用特定签名声明?这个问题的答案可以用来回答这个问题。但是这个问题的答案可能无法回答那个问题。

4

2 回答 2

0

你能做的最好的就是尝试在字符串评估中调用它:

$ perl -E 'sub foo ($bar) { return $bar } eval "foo()"; print "error: $@"'
error: Not enough arguments for main::foo at (eval 1) line 1, near "()
"

它需要是字符串-eval,而不是块-eval,因为您需要捕获编译时错误。

于 2021-05-25T14:40:37.260 回答
0

来自 irc.freenode.net/#perl,

15:06 < Grinnz> EvanCarroll:是的,也没有办法做到这一点

他说的是关于使用 API 获取函数签名的较早问题。

于 2020-09-10T20:10:21.183 回答