Typed hashes in Perl 6
在 Perl 6 中, 你可以通過指定變量的類型來限制變量容器的內(nèi)容, 例如:
my Int $i;
標(biāo)量變量中只有一個(gè)值。你可以將該概念擴(kuò)展到數(shù)組, 并讓其元素僅保存整數(shù), 如下例所示:
> my Int @i;
[]
> @i.push(42);
[42]
> @i.push('Hello');
Type check failed in assignment to @i;
expected Int but got Str ("Hello")
in block <unit> at <unknown file> line 1
哈希中保存的是 pairs, 所以你可以同時(shí)指定鍵和值的類型。語法和上面的例子并無不同。
首先, 讓我們聲明值的類型:
my Str %s;
現(xiàn)在, 可以將字符串作為哈希的值:
> %s<Hello> = 'World'
World
> %s<42> = 'Fourty-two'
Fourty-two
但這個(gè)哈希不能保存整數(shù):
> %s<x> = 100
Type check failed in assignment to %s;
expected Str but got Int (100)
in block <unit> at <unknown file> line 1
(順便提一下, 在 %s<42> 的情況下, 鍵是一個(gè)字符串。)
要指定第二個(gè)維度的類型, 即散列鍵的類型, 請?jiān)诨ɡㄌ栔兄付ㄦI的類型:
my %r{Rat};
這個(gè)變量也被稱為對象散列(object hash)。
有了這個(gè), Perl 允許使用 Rat 類型作為鍵:
> %r<22/7> = pi
3.14159265358979
> %r
{22/7 => 3.14159265358979}
嘗試使用整數(shù)或字符串作為鍵則會失敗, 例如:
> %r<Hello> = 1
Type check failed in binding to parameter 'key';
expected Rat but got Str ("Hello")
in block <unit> at <unknown file> line 1
> %r{23} = 32
Type check failed in binding to parameter 'key';
expected Rat but got Int (23)
in block <unit> at <unknown file> line 1
最后, 你可以同時(shí)指定鍵和值的類型:
my Str %m{Int};
此變量可用于將月份編號轉(zhuǎn)換為月份名稱, 但反過來不行:
> %m{3} = 'March'
March
> %m<March> = 3
Type check failed in binding to parameter 'key';
expected Int but got Str ("March")
in block <unit> at <unknown file> line 1