代码之家  ›  专栏  ›  技术社区  ›  Zaid

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

  •  2
  • Zaid  · 技术社区  · 16 年前

    我发现在指定 -command Tkx小部件的参数。

    选自 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() ?

    3 回复  |  直到 16 年前
        1
  •  6
  •   Michael Carman    16 年前

    你的语法不太正确。您的示例调用子例程( & 绕过任何原型)并传递返回值( &calculate() \&calculate() )到 -command 选项。您希望为子例程本身指定一个引用,您可以通过以下方式执行此操作:

    -command => \&calculate
    

    注意后面没有括号。还要注意,不能这样传递参数。如果要这样做,您需要将调用包装在匿名子例程中:

    -command => sub { calculate(12) }
    

    或将数组引用而不是代码引用传递给选项:

    -command => [\&calculate, 12]
    

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

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

    $x

        2
  •  2
  •   kixx    16 年前

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

    -command 钥匙。

    perlsub perlref

        3
  •  2
  •   spazm    16 年前

    扎伊德说:“我开悟了。但我 还是不明白为什么;计算 语法不适合我。。。扎伊德 “24分钟前”