2014-10-18 55 views
3

我讀Learning Perl 6th edition和子程序章有這樣的代碼:包圍私有變量的圓括號。爲什麼在這種情況下使用?

foreach (1..10) { 
    my($square) = $_ * $_; # private variable in this loop 
    print "$_ squared is $square.\n"; 
} 

現在我明白列表語法,即括號,作爲在列表環境和標量上下文來區分:

my($num) = @_; # list context, same as ($num) = @_; 
my $num = @_; # scalar context, same as $num = @_; 

但在foreach循環的情況下,我看不到列表上下文是如何合適的。

而且我可以改變的代碼是:

foreach (1..10) { 
    my $square = $_ * $_; # private variable in this loop 
    print "$_ squared is $square.\n"; 
} 

而且它的工作原理完全一樣。那麼爲什麼作者使用我的($平方)當一個簡單的我的$廣場可以被用來代替?

這種情況有什麼區別嗎?

+3

我會說「問作者」。在這種情況下,括號是多餘的。 – Toto 2014-10-18 09:46:41

回答

2

你完全正確。這是多餘的。它在這種情況下並沒有什麼區別,因爲你實際上是強制列表上下文來列出上下文操作。

E.g.

my ($square) = ($_ * $_); 

這也產生了相同的結果。所以 - 在這種情況下,並不重要。但一般來說不是很好的編碼風格。

+0

爲什麼它的編碼風格不好?如果你把「我的」聲明置於括號內,我不介意。 – 2014-10-18 13:15:21

+4

這是糟糕的編碼風格,因爲它會導致未來的維護者來到這裏並提出類似這樣的問題。 – tobyink 2014-10-18 13:51:48

+0

您可以 - 在技術上 - 在列表環境中執行所有變量操作。它會工作。在很多方面 - 只要你的代碼是一致的,那就是'OK'。但是對於代碼清晰度還有很多需要說明的地方 - 在不需要的時候強制列表上下文只會降低清晰度。 – Sobrique 2014-10-18 16:25:51

4

當然在這種情況下,括號是沒有必要的。他們不是嚴格的錯誤的,因爲他們確實按照作者的意圖去做。正如Perl中的那麼多,there's more than one way to do it

所以存在一個根本問題:爲什麼作者選擇這樣做?我起初不知道是否是筆者的首選風格:也許他選擇總是把他的新變量的多個列表中括號只是讓這樣的:

my ($count) = 4; 

其中括號沒有做任何事情有幫助,至少看着喜歡的東西是一致的:

my ($min, $max) = (2, 3); 

但看完整本書,我無法找到這個括號的使用比你所引用的部分以外的單一值的單一實例。作爲很多例子之一,第9章中的列表上下文部分中的包含my的各種不同用途以及賦值,但不包含任何單個值的括號。

我留下了這樣的結論筆者在與my($m, $n);子程序介紹my他試圖改變語法儘量少下一次他用它,用my($max_so_far)結束了,然後試圖解釋標量和列表就像你上面引用的那樣。我不確定這是非常有用的。

TL; DR這是沒有必要的,雖然它不是實際上錯了。在你的代碼中避免這種風格可能是個好主意。

相關問題