2

I find it a bit weird that I have to wrap defined subroutines anonymously when specifying the -command argument for Tkx widgets.

An excerpt from a TkDocs tutorial demonstrates this:

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

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

Why doesn't it work when I write -command => &calculate() or -command => \&calculate()?

4

3 に答える 3

6

構文が正しくありません。あなたの例はサブルーチンを呼び出し(&プロトタイプをバイパスします)、戻り値(&calculate())またはそれへの参照(\&calculate())を-commandオプションに渡します。サブルーチン自体への参照を割り当てたい場合は、次の方法で実行できます。

-command => \&calculate

末尾の括弧がないことに注意してください。また、この方法では引数を渡すことができないことに注意してください。これを行うには、呼び出しを無名サブルーチンでラップする必要があります。

-command => sub { calculate(12) }

または、オプションに CODE 参照の代わりに ARRAY 参照を渡します。

-command => [\&calculate, 12]

リテラル値の代わりに変数を使用する場合に重要な、2 つの形式には微妙な違いがあります。

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

最初のフォームの変更を使用する$xと、コマンドが呼び出されたときに表示されます。2 番目の形式では、そうではありません。各呼び出しには、バインディングが作成された時点での値が表示されます。どちらの形式も便利です。どちらを使用するかを決定する際には、適切な判断を下す必要があります。

于 2010-04-12T13:20:17.227 に答える
2

で動作するはず-command => \&calculateです。括弧がないことに注意してください。

あなたが与えた例は、実際にサブルーチンを実行し、それによって返された値を-commandキーに割り当てています。

詳細については、perlsubおよびperlrefを参照してください。

于 2010-04-12T08:03:59.360 に答える
2

Zaidは、「私は悟りを開いています。しかし、\&calculate構文が私と一緒に機能しない理由はまだわかりません... –Zaid24分前」と述べています。

Zaid、\&calculate構文は機能します。\&calculate()構文を使用しようとしていました。前者は「後で実行されるサブルーチン計算への参照」にバインドし、後者は「への参照」としてバインドします(引数なしで計算され、引数のプロトタイプをバイパスする呼び出しの戻り値)。

テスト/分析に使用できる、より長くコンパイル可能なコードスニペットはありますか?私は最近TKに精通していません。

于 2010-04-12T17:38:06.937 に答える