2

我觉得在-command为 Tkx 小部件指定参数时必须匿名包装定义的子例程有点奇怪。

TkDocs 教程的摘录演示了这一点:

my $cb = $frm->new_ttk__button ( -text => "Calculate",
                                 -command => sub {calculate();}  );

sub calculate {
   $meters = int(0.3048*$feet*10000.0+.5)/10000.0 || '';
}

-command => &calculate()为什么我写或时它不起作用-command => \&calculate()

4

3 回答 3

6

您的语法不太正确。您的示例调用子例程(&绕过任何原型)并将返回值(&calculate())或对它的引用(\&calculate())传递给-command选项。您想为子例程本身分配一个引用,您可以通过以下方式执行此操作:

-command => \&calculate

请注意缺少尾括号。另请注意,您不能以这种方式传递参数。如果你想这样做,你需要将调用包装在一个匿名子例程中:

-command => sub { calculate(12) }

或将选项传递给 ARRAY 引用而不是 CODE 引用:

-command => [\&calculate, 12]

如果您使用变量而不是文字值,这两种形式之间存在细微差别,这一点很重要。

-command => sub { calculate($x) }  # creates a closure over $x
-command => [\&calculate, $x]      # makes a copy of $x

$x调用命令时,使用第一个表单更改将是可见的。在第二种形式下,它们不会;每次调用都会看到创建绑定时的值。两种形式都有用;在决定使用哪个时,您只需要做出良好的判断。

于 2010-04-12T13:20:17.227 回答
2

它应该与-command => \&calculate. 注意没有括号。

您给出的示例实际上是执行子例程并将其返回的值分配给-command键。

有关详细信息,请参阅perlsubperlref

于 2010-04-12T08:03:59.360 回答
2

Zaid 说,“我很开明。但我仍然不明白为什么 \&calculate 语法不适用于我...... – Zaid 24 分钟前”

Zaid,\&calculate 语法确实有效。您试图使用 \&calculate() 语法。第一个绑定到“对稍后运行的子例程计算的引用”,后者绑定为“对(不带参数的调用计算的返回值,并绕过参数原型)的引用)。

您是否有可用于测试/分析的更长、可编译的代码片段?我最近不熟悉 TK。

于 2010-04-12T17:38:06.937 回答