Typed hashes in Perl 6
在 Perl 6 中, 你可以通過指定變量的類型來限制變量容器的內容, 例如:
my Int $i;
標量變量中只有一個值。你可以將該概念擴展到數(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, 所以你可以同時指定鍵和值的類型。語法和上面的例子并無不同坑资。
首先, 讓我們聲明值的類型:
my Str %s;
現(xiàn)在, 可以將字符串作為哈希的值:
> %s<Hello> = 'World'
World
> %s<42> = 'Fourty-two'
Fourty-two
但這個哈希不能保存整數(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>
的情況下, 鍵是一個字符串。)
要指定第二個維度的類型, 即散列鍵的類型, 請在花括號中指定鍵的類型:
my %r{Rat};
這個變量也被稱為對象散列(object hash)殖蚕。
有了這個, 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
最后, 你可以同時指定鍵和值的類型:
my Str %m{Int};
此變量可用于將月份編號轉換為月份名稱, 但反過來不行:
> %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