为什么没有这个代码失败的-c的Perl检查的两个版本?
-
20-09-2019 - |
题
new
的Parse::RecDescent
方法具有这样的原型:
sub new ($$$)
{
# code goes here
}
和,如果我创建一个对象是这样的:
my $parser = Parse::RecDescent->new($grammar);
它会创建一个解析器,并且该方法将获得2个参数“解析:: RecDescent的”和$语法,是吗?如果我尝试创建像一个对象:
Parse::RecDescent::new("Parse::RecDescent",$grammar)
这将失败,说:“没有足够的参数解析:: RecDescent的::新”,我理解这条消息。我只是路过2个参数。不过,我不明白为什么箭头版本的作品。
您可以解释一下吗?
解决方案
当调用它作为OO风格方法
函数原型不检查。此外,还绕过当调用的子带和,如在&sub(arg0, arg1..);
原型检查
不仅在“&”的形式进行参数列表可选的,它也禁止任何原型上的论点你提供检查。这部分是用于 由于历史的原因,部分是对于具有方便的方法来欺骗,如果你知道自己在做什么。见下文原型。
方法调用不被影响原型任一,因为要被调用的函数是在编译时不确定,由于所谓的确切的代码取决于继承。
虽然Parse::RecDescent::new("Parse::RecDescent", $grammar)
语法正确,这是调用构造函数的一个非常臭的方式,现在你强迫它在类中定义(而非祖先)。如果你真的需要验证你的论点,做到这一点的方法内:
sub new
{
my ($class, @args) = @_;
die "Not enough arguments passed to constructor" if @args < 2;
# ...
}
又见的原型这个问题早和为什么他们不通常这样一个好主意。
不隶属于 StackOverflow