2013-05-13 88 views
1

Why would I use Perl anonymous subroutines instead of a named one?子程序/函數引用啓發我思考的優點:匿名存儲在數據結構

  • 存儲在陣列中,哈希和標量匿名潛艇。

這是一個很酷的概念,但它在任何方面的實用嗎?有什麼理由不得不使用存儲在某種數據結構中的匿名subs/sub引用?或者可能是一個方便的情況?

我明白爲什麼在某些情況下需要匿名subs,例如處理共享變量(當一個匿名sub在另一個sub內被聲明時),但除非我遺漏了某些東西,我只是沒有看到使用任何類型的函數引用。看起來我們應該直接調用這些函數,代碼看起來會更好,更有組織。

請告訴我我錯了。我很想有一個很好的理由來使用這些東西。

在此先感謝。 >能($方法)在概念上類似於,但更靈活和細節被隱藏 -

my %disp = (
    foo => sub { 'foo' }, 
    bar => sub { 'bar' }, 
); 

my $cmd = get_cmd_somehow(); 
if (defined $disp{$cmd}) { 
    $disp{$cmd}->(@args) 
} else { 
    die "I don't know how to handle $cmd" 
} 

(經由方法調度:

+1

查找調度表的概念。 http://en.wikipedia.org/wiki/Dispatch_table – DavidO 2013-05-13 23:49:06

+0

那麼,符號表基本上是一個巨大的HoH(任意深度),並且它包含對每個命名子的引用。而這只是衆多用途之一。 – ikegami 2013-05-13 23:56:20

+0

@ikegami一些語言是否也將它用於函數中的閉包,以便它們可以跟蹤程序狀態? – squiguy 2013-05-13 23:59:40

回答

2

面向對象的方法非常類似於匿名子例程。多態性意味着對象的方法可以改變,而調用代碼不必手動查找以查看要運行的例程。這非常有用。

另外,想想perl的排序。爲什麼要爲簡單的排序方法設置一個命名的例程?同上映射和grep。

而且,迭代器非常有用。另外,考慮存儲可以稍後解決的例程,而不是隻能存儲靜態值。最後,如果你不想存儲匿名例程(甚至是引用例程),那就是你的業務。但擁有這個選擇比沒有它好。

5

甲調度表用於動態地確定基於一些值要採取的步驟是有用)

匿名函數和詞法關閉有許多其他用途;也許更深入地看「高階函數」。 (例如,考慮map()/ grep()。)

+0

調度不是使用匿名子例程的解釋。您可以使用正常的命名子例程實現相同的功能: my%disp =( foo => \&disp_foo, bar => \&disp_bar ); – msztolcman 2013-05-14 06:38:14

+0

這是真的 - 也解決了問題的第二部分,關於存儲在數據結構中的子引用。 – 2013-05-14 11:56:17