newParse::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..);原型检查

的perldoc perlsub

  

不仅在“&”的形式进行参数列表可选的,它也禁止任何原型上的论点你提供检查。这部分是用于   由于历史的原因,部分是对于具有方便的方法来欺骗,如果你知道自己在做什么。见下文原型。

     

方法调用不被影响原型任一,因为要被调用的函数是在编译时不确定,由于所谓的确切的代码取决于继承。

虽然Parse::RecDescent::new("Parse::RecDescent", $grammar)语法正确,这是调用构造函数的一个非常臭的方式,现在你强迫它在类中定义(而非祖先)。如果你真的需要验证你的论点,做到这一点的方法内:

sub new
{
    my ($class, @args) = @_;
    die "Not enough arguments passed to constructor" if @args < 2;
    # ...
}

又见的原型这个问题早和为什么他们不通常这样一个好主意。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top