我在哪里可以了解perl6类型变量(:: T)

时间:2018-06-08 21:08:37

标签: perl6

我需要使用perl6类型的变量。似乎最终的手册在http://www.jnthn.net/papers/2008-yapc-eu-perl6types.pdf,这是简明扼要的,并且对它有用。

我能指出哪些更全面或更权威的东西?

2 个答案:

答案 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] {…}