2010-04-12 72 views
2

我發現有點奇怪,我必須在爲Tkx小部件指定-command參數時匿名封裝定義的子例程。我是否總是必須提供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()爲什麼它不工作?

回答

6

您沒有語法完全正確。您的示例調用子例程(&繞過任何原型),並將返回值(&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。在第二種形式下,他們不會;每個調用將在創建綁定時看到該值。這兩種形式都很有用。在決定使用哪一種時,你只需要做出正確的判斷。

+0

我開悟了。但我仍然不明白爲什麼'\&calculate'語法不適用於我... – Zaid 2010-04-12 17:06:50

+0

@Zaid:我運行示例代碼將'sub {calculate()}'更改爲'\&calculate',它的工作原理是預期。說它「不起作用」是絕望的模糊。當你嘗試時發生了什麼? – 2010-06-03 19:30:03

+0

'\'計算'本身就是一種享受。 arrayref是什麼讓我絆倒,但你的解釋清除了爲什麼。謝謝一堆......如果可以的話,我會兩次投票贊成! – Zaid 2010-06-04 07:17:35

2

它應該與-command => \&calculate一起使用。請注意缺少括號。

你給出的例子實際上是執行子程序,並將它返回的值賦給-command鍵。

欲瞭解更多信息請參閱perlsubperlref

+0

沒有。它不執行,有或沒有parens。 – Zaid 2010-04-12 08:10:04

+0

看到' \%calculate'工作時沒有括號,如果我需要傳遞參數呢? – Zaid 2010-04-12 08:25:31

+0

這應該是'\&計算',而不是'\%計算'... – Zaid 2010-04-12 09:22:53

2

扎伊德說,「我很開明,但我仍然 不明白爲什麼\ &計算 語法不和我一起工作... - 扎伊德 24分鐘前」

Zaid,\ &計算語法確實有效。您正在嘗試使用\(計算)(\)語法。第一個綁定到「子程序計算稍後運行的引用」,後者綁定爲「引用(不帶參數的計算的返回值計算,並繞過參數原型)。

你有沒有一個較長的,可編譯的代碼片段,我們可以用於測試/分析?我最近不熟悉TK.

+0

TkDocs網站上的代碼。按照原始文章中的鏈接,將匿名子例程更改爲'\&calculate',並讓我知道它是否適合您。它不適合我。 – Zaid 2010-04-12 18:13:33

相關問題