gpt4 book ai didi

perl - 我是否总是必须为 Tkx 的 -command 参数提供一个匿名子程序?

转载 作者:行者123 更新时间:2023-12-01 01:09:17 25 4
gpt4 key购买 nike

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

摘自 TkDocs tutorial证明了这一点:

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() 时它不起作用?

最佳答案

您的语法不太正确。您的示例调用子例程(& 绕过任何原型(prototype))并传递返回值(&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 的更改将在调用命令时可见。在第二种形式下他们不会;每次调用都会看到绑定(bind)创建时的值。两种形式都有用;在决定使用哪个时,您只需要做出良好的判断。

关于perl - 我是否总是必须为 Tkx 的 -command 参数提供一个匿名子程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2620461/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com