創作內容

0 GP

Learning Perl - Moose - coerce 初學 ( 二 )

作者:晤遼小生│2015-02-01 21:28:14│巴幣:0│人氣:325
終於把這篇讀完喇!
首先是List::MoreUtils模組的zip功能,是把兩個串列互相交錯生成串列3
值得注意的是若兩陣列數量不等則會插入一個undef的值。
然後就是搞得我暈頭轉向的這段喇
coerce 'Human::EyeColor'
=> from 'ArrayRef'
=> via { my @genes = qw'bey2_1 bey2_2 gey_1 gey_2';
return Human::EyeColor->new( zip(@genes, @{$_}) ) };
has 'eyeColor' => ( is => 'ro', isa => 'Human::EyeColor', coerce => 1, required => 1 );



coerce 的作用時機是當有個 Human::EyeColor 類的參數(?)正在被定義的時候,coerce 會把定義式給的參數給轉換成coerce 函式中的樣式。
也就是當code是長這樣:
has 'eyeColor' => ( is => 'ro', isa => 'Human::EyeColor', required => 1 );
在定義時必須要使用這樣
my $test = Human->new( eyeColor => Human::EyeColor->new( ... ) );
而有了coerce,你可以直接給eyeColor這個屬性一個陣列參照,coerce會自動幫你new一個Human::EyeColor,如下面這行:
my $test = Human->new( eyeColor => [ qw/brown brown green green/ ] );
當在設定eyeColor時,定義了一個Human::EyeColor 類的參數,因此coerce 就把你給的參數
[ qw/brown brown green green/ ] 給送進 via 中的副程式裡。

例子中很酷的是,經過zip後送出的eyeColor參數是
eyeColor => Human::EyeColor->new( bey2_1 brown bey2_2 brown gey_1 green gey_2 green )
然後在Human::EyeColor中又規定了coerce,再次把參數給轉換( 口才不好 )
coerce 'Human::Gene::bey2'
=> from 'Str'
=> via { Human::Gene::bey2->new( color => $_ ) };
coerce 'Human::Gene::gey'
=> from 'Str'
=> via { Human::Gene::gey->new( color => $_ ) };

has [ qw'bey2_1 bey2_2' ] =>
( is => 'ro', isa => 'Human::Gene::bey2', coerce => 1 );
has [ qw'gey_1 gey_2' ] =>
( is => 'ro', isa => 'Human::Gene::gey', coerce => 1 );
也就是變成了
eyeColor => Human::EyeColor->new( bey2_1 => Human::Gene::bey2->new( color => brown ), .....)

最後overload '+' 就是定義了當該類的物件遇到運算式 + 的時候要做甚麼特殊處理
值得一提的是 $test + 1 的結果是一個undef的值,也就是只要該類物件遇到運算子 +
就會直接overload進副程式了,不會管被+的是不是該類的物件。
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=2733855
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:Perl|Moose|subtype|coerce

留言共 0 篇留言

我要留言提醒:您尚未登入,請先登入再留言

喜歡★ji32l42u3g4g 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:Learning Per...

追蹤私訊切換新版閱覽

作品資料夾

leo25127更新至1224回
穿越奇幻日常系小說『公爵家的獨生子』更新囉,來看看我們無厘頭的ㄎ一ㄤ少爺怎麼在異世界作威作福吧!看更多我要大聲說昨天18:08


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】