Quick Tip #19: 創(chuàng)建可重用的數據類型

Quick Tip #19: 創(chuàng)建可重用的數據類型

Perl 6 允許你使用類型來約束變量值,但是你不必拘泥于內置類型维咸。一旦你定義了自己的類型回懦,它們就表現得像內置類型一樣闽撤。

下面是我從布拉德的 Subsets::Common模塊偷得的一些子集(subsets):

my package EXPORT::DEFAULT {
    ...
    subset Pos of Numeric where * > 0;
    subset Neg of Numeric where * < 0;
    subset Zero of Numeric where * == 0;
    subset UNumeric of Numeric where * >= 0;

    subset Even of Int where * % 2 == 0;
    subset Odd  of Int where * % 2;

    subset Time::Hour12 of PosInt where * ~~ 1 .. 12;
    subset Time::Hour24 of Int    where * ~~ 0 .. 23;
    subset Time::Minute of Int    where * ~~ 0 .. 59;
    subset Time::Second of Int    where * ~~ 0 .. 59;
    ...
}

subset 關鍵字開啟子集的聲明, 后面跟著你想要的新類型的名字。這是一個子集届惋,因為你基于已經存在的類型使用 of 關鍵字來聲明該子集。在那之后贩据,你可以使用一個 where 從句來改進你的新類型荣病。

并且码撰,布拉德把這些子集都放在了包里而且聲明所有東西都是可導出的。

我也創(chuàng)建了一個 Perl 6 版本的 Chemistry::Elements个盆。不要太在意代碼中有什么東西, 多考慮你要聲明的值是否滿足你想要的約束脖岛。下面這個例子我聲明了一個類型用來約束一個整數為一個已知的原子數:

subset ZInt of Cool is export where {
    state ( $min, $max ) = %names.keys.sort( { $^a <=> $^b } ).[0,*-1];
    ( $_.truncate == $_ and $min <= $_ <= $max )
        or
    note "Expected a known atomic number between $min and $max, but got $_"
        and
    False;
    };

對于我這個子集, 我通過把它聲明為 is export 來導出它,以至于其它使用該模塊的人能夠從這個模塊的外部使用這個類型颊亮。特別要注意的是柴梆,當給定的值不匹配時我可以指定一個特殊的錯誤提示信息。

文章下面還評論說:

“where * ~~ 0..59” is redundant; since it’s already being smart-matched, this can just be “where 0..59”.

意思是 where * ~~ 0..59 是多余的编兄,因為它已經被智能匹配,它可以只寫為 where 0..59声登。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末狠鸳,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子悯嗓,更是在濱河造成了極大的恐慌件舵,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脯厨,死亡現場離奇詭異铅祸,居然都是意外死亡,警方通過查閱死者的電腦和手機合武,發(fā)現死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門临梗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人稼跳,你說我怎么就攤上這事盟庞。” “怎么了汤善?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵什猖,是天一觀的道長。 經常有香客問我红淡,道長不狮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任在旱,我火速辦了婚禮摇零,結果婚禮上,老公的妹妹穿的比我還像新娘桶蝎。我一直安慰自己遂黍,他們只是感情好终佛,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著雾家,像睡著了一般铃彰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上芯咧,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天牙捉,我揣著相機與錄音,去河邊找鬼敬飒。 笑死邪铲,一個胖子當著我的面吹牛,可吹牛的內容都是我干的无拗。 我是一名探鬼主播带到,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼英染!你這毒婦竟也來了揽惹?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤四康,失蹤者是張志新(化名)和其女友劉穎搪搏,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體闪金,經...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡疯溺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了哎垦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片囱嫩。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖漏设,靈堂內的尸體忽然破棺而出挠说,到底是詐尸還是另有隱情,我是刑警寧澤愿题,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布损俭,位于F島的核電站,受9級特大地震影響潘酗,放射性物質發(fā)生泄漏杆兵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一仔夺、第九天 我趴在偏房一處隱蔽的房頂上張望琐脏。 院中可真熱鬧,春花似錦、人聲如沸日裙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昂拂。三九已至受神,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間格侯,已是汗流浹背鼻听。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留联四,地道東北人撑碴。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像朝墩,于是被迫代替她去往敵國和親醉拓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內容