所以我的模块有一个名为的方法push.在这个方法中,我调用了perl的内置push函数.现在我有另一个名为的unshift方法,在这个方法中,我再次调用perl的内置push函数.
1 package Deque;
2
3 ...
4 sub push {
5 my ($self, $node) = @_;
6 push @{ $self->{nodes} } => $node;
7 ...
8 }
9
10 sub unshift {
11 my ($self, $node) = @_;
12 push @{ $self->{nodes} } => $node;
13 ...
14 }
Run Code Online (Sandbox Code Playgroud)
该程序运行,但我收到此警告Ambiguous call resolved as CORE::push() ... line 12.
所以我将第12行更改为CORE::push @{ $self->{nodes} } => $node,警告消失了.
为什么perl没有警告我第6行?有没有更好的方法摆脱警告?我无法更改方法名称.
请注意,如果交换子例程,则不会显示任何警告:
sub unshift {
my ($self, $node) = @_;
push @{ $self->{nodes} } => $node;
}
sub push {
my ($self, $node) = @_;
push @{ $self->{nodes} } => $node;
}
Run Code Online (Sandbox Code Playgroud)
......但如果预先宣布,则有两个push:
sub push;
sub unshift {
my ($self, $node) = @_;
push @{ $self->{nodes} } => $node;
}
sub push {
my ($self, $node) = @_;
push @{ $self->{nodes} } => $node;
}
# Ambiguous call resolved as CORE::push(), qualify as such or use & at line 10.
# Ambiguous call resolved as CORE::push(), qualify as such or use & at line 15.
Run Code Online (Sandbox Code Playgroud)
我的猜测是,push在解析整个子例程的主体之前,基本上不会考虑包中定义的名称.这就是为什么在子程序中这个调用不被认为是模棱两可的.
尽管如此,我还是假设CORE::在perldiag中建议使用前缀添加所有相应的呼叫.
要将[子例程名称]静默解释为Perl运算符,请
CORE::在运算符上使用前缀(例如CORE::log($x))或将子例程声明为对象方法.
| 归档时间: |
|
| 查看次数: |
314 次 |
| 最近记录: |