2009-09-16 60 views

回答

6

如果您開始使用,您會發現​​符合您的喜好。類型自動具有is_ $ type()和to_ $ type()。這些用於確保您輸入傳遞類型約束,或者使您的輸入對該類型具有有效的強制。即使對於這些類型的東西,我也更喜歡它們,因爲您可以確保您的對象的狀態具有上述類型,無需額外費用。

use Moose; 
has 'foo' => (isa => MyType, is => ro); 

sub _check_my_type { 
    my ($self, $type) = @_; 
    is_MyType($type); 
}; 

它可能會缺乏對深/遞歸類型一定的支撐,但如果你用這個東西,在現代的Perl你可能「這樣做是錯誤的。」而是使用一個擁有自己的一致性檢查的對象(就像我的MyType一樣),然後傳遞這個對象。

+0

駝鹿不是一個壞建議,如果你可以使用它。如果你不能,鼠標是Moose-light。這將爲您帶來類型檢查以及其他一些沒有Moose依賴的其他功能,並且不會出現相同的編譯時間。 要清楚,我<3穆斯,但對於CGIs,它並不總是最好的選擇。 – mikegrb 2009-09-16 15:54:08

+2

鼠標沒有被積極開發。這是一個死的項目(根據Mouse.pm使用Moose而不是Mouse)的文檔。不幸的是,鼠標文檔甚至不會爲CGI提供它!相反,他們說:「儘管多年來取得了顯着進步,但編譯時間的懲罰對於一些非常特殊的應用程序來說是不起步的。如果您編寫的命令行應用程序或CGI腳本的啓動時間很重要,您可以不能使用Moose,如果可能的話,我們建議你使用HTTP :: Engine和FastCGI作爲後者。「 http://rt.cpan.org/Public/Bug/Display.html?id=42203 – 2009-09-16 17:56:38

5

看看MooseX::Method::Signatures它提供的不僅僅是驗證參數。從POD

實施例:

package Foo; 

use Moose; 
use MooseX::Method::Signatures; 

method morning (Str $name) { 
    $self->say("Good morning ${name}!"); 
} 

method hello (Str :$who, Int :$age where { $_ > 0 }) { 
    $self->say("Hello ${who}, I am ${age} years old!"); 
} 

method greet (Str $name, Bool :$excited = 0) { 
    if ($excited) { 
     $self->say("GREETINGS ${name}!"); 
    } 
    else { 
     $self->say("Hi ${name}!"); 
    } 
} 

MooseX::Method::Signatures還帶有MooseX::Declare作爲標準帶來更顯性感語法來Perl的板。上面可以寫像這樣(只顯示爲簡潔第一種方法):

use MooseX::Declare; 

class Foo { 

    method morning (Str $name) { 
     $self->say("Good morning ${name}!"); 
    } 
} 

還爲純子程序的必然結果signatures CPAN模塊,但不幸的是它上面的不作爲功能豐富。

2

我目前正在研究同一個問題作爲OP

我注意到,戴維Rolsky - 駝鹿成名的超高效程序員 - 最近(2009年)接管維護PARAMS ::驗證的,所以我覺得這一個好兆頭。該模塊自2003年以來尚未升級。所以我猜,它仍然可以用於檢查子程序參數。

+0

我喜歡Params :: Validate,但它似乎寧願死,而不想報告無效的參數,讓腳本繼續運行... – Marcus 2013-06-25 20:21:26