Всегда ли мне нужно предоставлять аргумент -kmand команды Tkx анонимной подпрограммой? - PullRequest
2 голосов
/ 12 апреля 2010

Мне немного странно, что мне приходится анонимно оборачивать определенные подпрограммы при указании аргумента -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()?

Ответы [ 3 ]

6 голосов
/ 12 апреля 2010

У вас не совсем правильный синтаксис. В ваших примерах вызывается подпрограмма (& обходит любые прототипы) и передает либо возвращаемое значение (&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 будут видны при вызове команды. Под второй формой они не будут; каждый вызов будет видеть значение в момент создания привязки. Обе формы полезны; вам просто нужно проявить здравый смысл при принятии решения, какой из них использовать.

2 голосов
/ 12 апреля 2010

Зайд сказал: «Я просветленный. Но я до сих пор не понимаю, почему \ & рассчитать синтаксис не работает со мной ... - Заид 24 минуты назад "

Zaid, синтаксис \ & Calculate работает. Вы пытались использовать синтаксис \ & Calculate (). Первый связывает с «ссылкой на вычисление подпрограммы, которое будет выполнено позже», последний связывается как «ссылка на (возвращаемое значение вызова вычисления без аргументов и в обход прототипов аргументов).

У вас есть более длинный, скомпилированный фрагмент кода, который мы можем использовать для тестирования / анализа? Я недавно не знаком с ТЗ.

2 голосов
/ 12 апреля 2010

Должен работать с -command => \&calculate.Обратите внимание на отсутствие скобок.

Приведенные вами примеры фактически выполняют подпрограмму и присваивают возвращаемое ей значение клавише -command.

Для получения дополнительной информации см. perlsub и perlref

...