2009-02-18 67 views
7

Moose::Manual::Attributes狀態:爲什麼穆斯的建設者會採取字符串值?

作爲替代使用子程序參考[默認],您可以代替你的屬性提供一個構建器方法: ... 這有幾個優點。首先,它將一大塊代碼移到自己命名的方法中,從而提高了可讀性和代碼組織。

所以,你的屬性可以定義正是如此默認:

has attr => (
    is => 'ro', 
    builder => 'subroutine' 
); 
sub subroutine { 
    # figure out and return default value 
} 

我不明白爲什麼這必須是從默認分開。你不能只傳遞一個指定的子程序嗎?

has attr => (
    is => 'ro', 
    default => \&subroutine 
); 

並且這不是更好的編程實踐,因爲你保證不會意外地引用一個不存在的子程序嗎?你會用一個邏輯引用而不是一個符號引用來引用這個方法。

回答

14

當構造器被調用時,發生這種情況:

$object->$builder 

如果Builder是一個字符串(比方說build_attr),那麼用戶可以寫在子類中自己build_attr方法,它會被調用。這使得默認值可以通過簡單的命名方法機制擴展。

如果是對子程序的引用,則引用是在原始類的包中進行的,這意味着它不能以相同的方式被覆蓋。

10

這不是一個「符號」的參考。建造者是一種方法名稱。這意味着它可以從一個角色繼承和組合。如果您傳遞子例程引用,則該引用必須存在於同一個包中(或者是完全限定的)。

我很確定我在手冊中解釋了這一點。不清楚嗎?

+0

那麼,我知道它不是在Perl意義上的參考;我只是想,更好的編程習慣是將真實的參考傳遞給一個命名的子程序,出於我提到的原因。 但是,你是對的;手冊的其餘部分確實說明了爲什麼這種方式是可取的... – skiphoppy 2009-02-18 16:34:07

7

子類。

Builder中指定的方法名稱來調用,所以

package Something; 
use Moose; 

extends 'YourClass'; 

sub subroutine { <some other default> } 

將有一些::子程序呼籲「子程序」的建設者,而如果你使用的子參考的風格,那麼在YourClass ::子程序會而是因爲你直接引用了子例程而不是讓它通過方法分派。

相關問題