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

p6s*_*eve 6 perl6

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

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

tim*_*imo 5

你所指的是perl6中的“类型捕获”,这里有两页关于它们的内容:

希望有帮助!


Bra*_*ert 4

\n\n

我喜欢这样想,它真的Int很短::Int

\n\n

因此,大多数时候,当您谈论类型时,您可以添加::在它的前面添加 。

\n\n

事实上,如果您有一个字符串并且您想使用它来获取与您使用的短名称相同的类型::(\xe2\x80\xa6)

\n\n
my $type-name = \'Int\';\nsay 42 ~~ ::($type-name); # True\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

问题是,在签名中使用类型已经用于指示参数属于该类型。

\n\n
->   Int $_   {\xe2\x80\xa6}\n
Run Code Online (Sandbox Code Playgroud)\n\n

签名中任何未签名的标识符都被视为如上所示,因此如果不存在,则以下内容将引发错误foo

\n\n
->   foo   {\xe2\x80\xa6}\n
Run Code Online (Sandbox Code Playgroud)\n\n

在上述情况下,您可能想要的是foo一个无 sigiless 变量。所以必须\\在前面加一个。(在您刚刚使用的块内部foo。)

\n\n
->   \\foo   {\xe2\x80\xa6}\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

因此,如果您想添加一个捕获类型的功能,您必须做一些与仅使用标识符不同的事情。所以显然添加::选择添加到前面。

\n\n
->   ::foo   { say foo }\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您用该号码调用它42,它就会打印出来(Int)

\n\n
\n\n

你可以结合这些

\n\n
-> Real ::Type \\Value {\xe2\x80\xa6}\n
Run Code Online (Sandbox Code Playgroud)\n\n

上面只接受实数(除了复数之外的所有数字),将类型别名为Type,将数字别名为Value

\n\n
sub example ( Real ::Type \\Value ) {\n  my Type $var = Value;\n\n  say Type;\n  say Value;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n
> example 42;\n(Int)\n42\n\n> example \'\'\nType check failed in binding to parameter \'Value\'; expected Real but got Str ("")\n  in block <unit> at <unknown file> line 1\n\n> example 42e0\n(Num)\n42\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

这也用在角色中。

\n\n
role Foo[ Real ::Type \\Value ] {\n  has Type $.foo = Value; # constrained to the same type as Value\n}\nclass Example does Foo[42] {}\n\nsay Example.new( :foo(128) ).foo; # 128\nsay Example.new().foo;            # 42\n\nsay Example.new( :foo(1e0) );     # Type check error\n
Run Code Online (Sandbox Code Playgroud)\n\n

当然,您可以省略任何不需要的部分。

\n\n
role Foo[::Type] {\xe2\x80\xa6}\n
Run Code Online (Sandbox Code Playgroud)\n