2011-12-12 381 views
0

在穆斯1.x版,我曾經是能夠做到這一點:駝鹿特質

package Class; 
use Test::More tests => 1; 
use Moose; 
use MooseX::Types::Moose qw/Undef Str/; 

eval { 
    has 'trait_boom' => (
    is => 'rw' 
    , isa => Str | Undef 
    , default => '' 
    , traits => ['String'] 
); 
}; 

ok ([email protected], "Created attr trait_boom, a type union of Str and Undef\[email protected]"); 

但是,它不再與駝鹿2.x的工作我假設這is a bug。爲什麼穆斯打破向後兼容性?是否有另一種方式來完成這項工作。我希望那是UndefStr。我不想強制Undef爲空字符串。

我只在這裏問,因爲顯然磁鐵是打破

17:43 [perl2] -!- ERROR Closing Link: 64.200.109.13 (Banned) 

回答

2

我猜這是在穆斯2.0300,週五,2011年9月23日改爲:

  • ->is_subtype_of和對於聯合類型,->is_a_type_of方法已更改其行爲 。以前,如果它們的任何成員 類型對於給定類型返回true,則返回true。現在,所有的成員類型必須 返回true。 RT #67731。 (戴維Rolsky)

你試過Maybe[Str]而不是Str | Undef

+0

是的,都失敗了。 –

2

正如我們在MagNet上告訴你的,因爲我報告了你的禁止逃稅行爲,這不是一個錯誤。特質的方法不應該違背值Undef,所以允許這種行爲在1.x下工作就是bug。穆斯具有針對正確行爲進行優化的方式,並且從未承諾版本之間的bug兼容。

您需要編寫自己的特徵或手動編寫方法來處理這種情況。

+0

有沒有一種更簡單的方式來使特質適用只有當屬性通過'is_Str()'?這聽起來像是針對這個非問題的更好的解決方案。 我以前只是做 '$ foo-> trait_provided_attribute if defined $ foo-> attribute;' 這對我來說工作得很好。 –

+0

屬性特徵適用於類聲明時,該值僅在實例化對象時可用,所以在這裏應用特質爲時已晚(某些奇怪的黑客被排除)。就個人而言,我只是提出兩個屬性。 – phaylon