sub foo的语法是什么:method {shift-> bar(@_)}?

ask*_*ker 7 perl

sub foo : method { shift->bar(@_) }
Run Code Online (Sandbox Code Playgroud)

: method这里的意思是什么 ?

我从来没用过这种方式......

Iva*_*uev 11

: method功能属性描述.如此标记的子程序不会触发"不明确的调用解析为CORE ::%s"警告.

ysth的评论:

当sub与内置命令同名并且在没有&而不是方法调用的情况下调用它时,会发出警告; perl使用内置而是发出警告.:方法使警告静默,因为它清楚地表明sub无论如何都不打算被称为非方法.

更新

这段代码只是在调用bar时调用方法foo:

sub foo : method {  ## Mark function as method
    shift->bar(@_)  ## Pass all parameters to bar method of same object
}
Run Code Online (Sandbox Code Playgroud)

更多细节:

  • : method - 表示引用的子例程是一种方法.如此标记的子程序不会触发"不明确的调用解析为CORE ::%s"警告.
  • shift-获得第一个参数的@_,这将是$self
  • ->bar(@_)- bar使用所有其他参数调用相同的类方法

你可以这样读:

sub foo : method {
    my ($self) = shift @_; 
    return $self->bar(@_);
}
Run Code Online (Sandbox Code Playgroud)

  • 当sub与内置命令同名并且没有`&`而不是方法调用时,会发出警告; perl使用内置而是发出警告.:方法使警告静默,因为它清楚地表明sub无论如何都不打算被称为非方法. (5认同)