Perl 6 Calendar 2016 - 第三天】欠薄- 對(duì)象哈希

第三天≌鸬贰- 對(duì)象哈希

Perl 6 添加對(duì)象散列, 其鍵并不僅僅是字符串。這些鍵是值和類型的結(jié)合闹炉。這意味著對(duì)象可以被字符串化為同樣的東西但是它們可以是不同的鍵蒿赢。

普通的哈希構(gòu)造:

use v6;

my Int    $int     = 4;
my Str    $str     = "4";
my IntStr $int_str = <4>;  # Allomorph

my %hash;
%hash{$int}     = 'Plain old number';
%hash{$str}     = 'String of digits';
%hash{$int_str} = 'Dualvar';

say "There are ", %hash.elems, " elements in the hash";

# this calls the .gist method, sorta like a dumper routine
%hash.say;

結(jié)果顯示該哈希中只有一個(gè)元素并且這個(gè)元素是我最后添加的那個(gè):

There are 1 elements in the hash
{4 => Dualvar}

但是我也可以通過告訴哈希我想要它接受的對(duì)象來聲明一個(gè)對(duì)象哈希(Object hash)。我可以使用 Any 對(duì)象來允許哈希接受任何東西:

my %hash{Any}; # accept any sort of object

下面的程序幾乎和上面的一樣渣触,但是表現(xiàn)的很不同:

use v6;

my Int    $int     = 4;
my Str    $str     = "4";
my IntStr $int_str = <4>;  # Allomorph

my %hash{Any};
%hash{$int}     = 'Plain old number';
%hash{$str}     = 'String of digits';
%hash{$int_str} = 'Dualvar';

say "There are ", %hash.elems, " elements in the hash";

# this calls the .gist method, sorta like a dumper routine
%hash.say;

現(xiàn)在我能在該哈希中看到 3 個(gè)元素了诉植。這個(gè)哈希以 .gist 形式打印出來后看起來有點(diǎn)奇怪,因?yàn)樗?4 個(gè)鍵都是 4:

There are 3 elements in the hash
{4 => Dualvar, 4 => Plain old number, 4 => String of digits}

使用 .perl 方法能看到背后的真相:

%hash.perl.say;

現(xiàn)在我能看到該哈希中有 3 種不同的對(duì)象:

There are 3 elements in the hash
(my Any %{Any} = IntStr.new(4, "4") => "Dualvar", 4 => "Plain old number", "4" => "String of digits")

用上對(duì)象哈希后昵观,測(cè)試存在性就有點(diǎn)不同了晾腔。它使用 .WHICH 方法,使用對(duì)象相等操作符 === 來比較鍵啊犬。

use v6;

my Int    $int     = 4;
my IntStr $int_str = <4>;  # Allomorph

my %hash{Any};
%hash{$int}     = 'Plain old number';
%hash{$int_str} = 'Dualvar';

my $other_int = 4;

# what are these things?
say "int: " ~ $int.WHICH;
say "other: " ~ $other_int.WHICH;

# are they the same?
say $int === $other_int ?? 'Same object' !! 'Different object';

# is it in the hash?
say %hash{$other_int}:exists ?? 'Other int exists in hash' !! 'Other int not there';

say %hash{"4"}:exists ?? '"4" exists in hash' !! '"4" not there';

我可以看到 $int$other_int 看起來像同一個(gè)對(duì)象灼擂。然而,鍵 "4" 不在該哈希中即使它擁有同樣的字符串 "4":

int: Int|4
other: Int|4
Same object
Other int exists in hash
"4" not there

如果它和我的期望不一樣這看起來就可能有點(diǎn)奇怪觉至。

我們來看尖括號(hào)版本的引號(hào)單詞操作符剔应,<...>。這種形式的引號(hào)單詞創(chuàng)建了 allomorphs(字素變體)。當(dāng)它看見像數(shù)字那樣的東西時(shí)峻贮,它創(chuàng)建繼承自數(shù)字和字符串兩邊的諸如 IntStr 的東西席怪。這意味著,盡管它作為一個(gè)對(duì)象哈希纤控,但是它擁有一個(gè)很特殊的形式挂捻。在下面這個(gè)哈希對(duì)象中,我使用 <> 引號(hào)在鍵 4 的周圍創(chuàng)建了一個(gè)元素船万。然后我測(cè)試字符串 "4" 是否在該哈希中:

use v6;

my %hash{Any};

%hash = 1;

say %hash{"4"}:exists ?? 'Exists in hash' !! 'Not there';

我看到它并沒有在該哈希中:

Not there

這個(gè)語素變體版本是一個(gè) IntStr, 其中 "4" 是一個(gè) Str刻撒。它們不是同一個(gè)對(duì)象,所以后者不是該哈希中的鍵耿导。

如果這正是你所期待的声怔,這不是一個(gè)大問題。但是舱呻,考慮一個(gè)更有用的只允許某種類型的對(duì)象的對(duì)象哈希演怎。也許我想讓它們都是 Date 類型的對(duì)象份名。下面這種方式不能工作:

my %hash{Date};
%hash{Date.new(now)} =  ( event => 'Something cool', rating => '6 stars' );

my $too_cool_for_your_api = '12-03-2016';
say %hash{ $too_cool_for_your_api };

當(dāng)我試圖繞過約束的時(shí)候贩据,我得到一個(gè)異常:

Type check failed in binding to key; expected Date but got Str ("12-03-2016")

Perl 6 讓我強(qiáng)迫其他程序員按照我需要的方式構(gòu)造哈希鍵贫贝。

最后 Zoffix Znet 補(bǔ)充了一句:

你還可以約束值的類型。申明變量的時(shí)候把類型放在變量名前面就好了:

my Date %hash{Int}; # use Int keys and accept only Date values

%hash{42} = 72; # Type check failed in binding to assignval; expected Date but got Int (72)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末殖氏,一起剝皮案震驚了整個(gè)濱河市晚树,隨后出現(xiàn)的幾起案子姻采,更是在濱河造成了極大的恐慌雅采,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件慨亲,死亡現(xiàn)場(chǎng)離奇詭異婚瓜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)刑棵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門巴刻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蛉签,你說我怎么就攤上這事胡陪。” “怎么了碍舍?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵柠座,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我片橡,道長(zhǎng)妈经,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮吹泡,結(jié)果婚禮上骤星,老公的妹妹穿的比我還像新娘。我一直安慰自己爆哑,他們只是感情好洞难,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著泪漂,像睡著了一般廊营。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上萝勤,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天露筒,我揣著相機(jī)與錄音,去河邊找鬼敌卓。 笑死慎式,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的趟径。 我是一名探鬼主播瘪吏,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蜗巧!你這毒婦竟也來了掌眠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤幕屹,失蹤者是張志新(化名)和其女友劉穎蓝丙,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體望拖,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡渺尘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了说敏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸥跟。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖盔沫,靈堂內(nèi)的尸體忽然破棺而出医咨,到底是詐尸還是另有隱情,我是刑警寧澤架诞,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布拟淮,位于F島的核電站,受9級(jí)特大地震影響侈贷,放射性物質(zhì)發(fā)生泄漏惩歉。R本人自食惡果不足惜等脂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望撑蚌。 院中可真熱鬧上遥,春花似錦、人聲如沸争涌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亮垫。三九已至模软,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間饮潦,已是汗流浹背燃异。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留继蜡,地道東北人回俐。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像稀并,于是被迫代替她去往敵國和親仅颇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 標(biāo)題: Rakudo and NQP Internals子標(biāo)題: The guts tormented imple...
    焉知非魚閱讀 1,393評(píng)論 1 3
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法碘举,類相關(guān)的語法忘瓦,內(nèi)部類的語法,繼承相關(guān)的語法引颈,異常的語法耕皮,線程的語...
    子非魚_t_閱讀 31,665評(píng)論 18 399
  • 從匹配中返回值 Match 對(duì)象 成功的匹配總是返回一個(gè) Match 對(duì)象, 這個(gè)對(duì)象通常也被放進(jìn) $/ 中, (...
    焉知非魚閱讀 1,805評(píng)論 0 1
  • 今天跟媽媽說了,嗯嗯感情公開了线欲,要好好的處了明场。王逗比汽摹,如果你對(duì)我不好李丰,我就去找未婚夫去~哼~
    惠木子小姐閱讀 138評(píng)論 0 1
  • 每天:3.5h 每周:3.5x5=17.5h 每月:17.5x4=70h 每年:70x12=840h 840h=5...
    暢談一下閱讀 528評(píng)論 2 2