我正在写一个WxPerl程序,而不是
$panel->SetDropTarget( MyTextDropTarget->new($panel) );
我写了
$panel->SetDropTarget->( MyTextDropTarget->new($panel) );
并且Perl没有抱怨。 (Perl使用一些参数调用了一些函数,并且脚本错误地输出了错误消息:
用法:位于./x.pl第230行的Wx :: Window :: SetDropTarget(THIS,target)。
添加了编辑:
好的,如果$ x = \& some_function,那么我理解为什么
$x->($arg1, $arg2, ...)
调用some_function($ arg1,$ arg2,.....)。
runrig的例子是一种可能性,但我很确定: 1)$ panel包含一个受祝福的对象引用,而不是一个字符串。 2)SetDropTarget是$ panel的一个方法(在基类中)。
从错误消息中我们可以假设正在调用SetDropTarget()。如果runrig的例子仍然适用于此(我猜它确实如此),那么即使SetDropTarget后面没有括号,即我有
$panel->SetDropTarget->
而不是
$panel->SetDropTarget()->
Perl仍在调用SetDropTarget? (检查其参数的数量和类型,然后在运行时致命抱怨)。这是怎么回事?
答案 0 :(得分:6)
因为它是完全有效的语法。 $panel->SetDropTarget->( MyTextDropTarget->new($panel) )
表示“从&SetDropTarget
调用$panel
方法,然后取消引用&SetDropTarget
返回的subref”。我猜这不是你打算写的,但是任何错误都会在运行时抛出,即使在严格模式下也是如此。
答案 1 :(得分:6)
您的SetDropTarget可能不会返回代码引用,但在运行时之前您无法确定:
#!/usr/bin/perl
my $panel = 'main';
$panel->SetDropTarget->("bloomin'");
sub SetDropTarget {
return sub { print "Set the $_[0] drop target!\n" }
}
答案 2 :(得分:1)
解析Perl
$panel->SetDropTarget->( MyTextDropTarget->new($panel) );
表示“$panel
是一个对象;调用其SetDropTarget
方法(省略了可选括号),它将返回对sub
的引用;调用sub
,将MyTextDropTarget->new($panel)
的结果作为其单个参数传递。“
也就是说,Perl在以下代码中期望SetDropTarget
类似于foo
:
sub foo {
return sub {
my $bar = shift;
return $bar . ', world!';
}
}
foo()->('Hello');
foo->('Goodby');