我需要使用perl6类型的变量。似乎最终的手册在http://www.jnthn.net/papers/2008-yapc-eu-perl6types.pdf,这是简明扼要的,并且对它有用。
我能指出哪些更全面或更权威的东西?
答案 0 :(得分:4)
你所指的是perl6中的“类型捕获”,这里有两页关于它们:
希望有所帮助!
答案 1 :(得分:4)
我喜欢这样的方式是Int
对于::Int
来说真的很短。
所以大部分时间你都在谈论一种类型,你可以将::
添加到它的前面。
事实上,如果您有一个字符串,并且您想使用它来获取具有相同短名称的类型,则使用::(…)
my $type-name = 'Int';
say 42 ~~ ::($type-name); # True
问题在于,使用签名中的类型已经用于表示该参数属于该类型。
-> Int $_ {…}
签名中的任何未签名的标识符都被视为上述标识符,因此如果没有foo
类型,则以下内容会引发错误。
-> foo {…}
在上述情况下你可能想要的是foo
是一个不合逻辑的变量。因此,您必须在前面添加\
。 (在块的内部,您只需使用foo
。)
-> \foo {…}
因此,如果您想要添加捕获类型的功能,则必须执行与使用标识符不同的操作。所以很明显选择了::
添加到前面。
-> ::foo { say foo }
如果您使用号码42
拨打电话,则会打印(Int)
。
您可以将这些结合起来
-> Real ::Type \Value {…}
上面只接受一个实数(除了复数外的所有数字),将类型别名为Type
,并将数字别名为Value
sub example ( Real ::Type \Value ) {
my Type $var = Value;
say Type;
say Value;
}
> example 42;
(Int)
42
> example ''
Type check failed in binding to parameter 'Value'; expected Real but got Str ("")
in block <unit> at <unknown file> line 1
> example 42e0
(Num)
42
这也用于角色。
role Foo[ Real ::Type \Value ] {
has Type $.foo = Value; # constrained to the same type as Value
}
class Example does Foo[42] {}
say Example.new( :foo(128) ).foo; # 128
say Example.new().foo; # 42
say Example.new( :foo(1e0) ); # Type check error
你当然可以放弃任何你不需要的部分。
role Foo[::Type] {…}