我在哪里可以了解 perl6 类型变量 (::T)
Where can I learn about perl6 Type variables (::T)
我需要使用 perl6 类型的变量。看来权威手册在这里http://www.jnthn.net/papers/2008-yapc-eu-perl6types.pdf,简明扼要,就目前而言非常有用。
有什么更全面或更权威的可以指给我看吗?
你指的是 perl6 中的 "type capture",这里有两个关于它们的页面:
- function/method 签名中的类型捕获:https://docs.perl6.org/type/Signature#index-entry-Type_Capture_%28signature%29
- 角色中的类型捕获:https://docs.perl6.org/language/typesystem#index-entry-Type_Capture_%28role%29
希望对您有所帮助!
我喜欢这样想的是 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 {…}
上面只接受一个实数(除了 Complex 之外的所有数字),将类型别名为 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] {…}
我需要使用 perl6 类型的变量。看来权威手册在这里http://www.jnthn.net/papers/2008-yapc-eu-perl6types.pdf,简明扼要,就目前而言非常有用。
有什么更全面或更权威的可以指给我看吗?
你指的是 perl6 中的 "type capture",这里有两个关于它们的页面:
- function/method 签名中的类型捕获:https://docs.perl6.org/type/Signature#index-entry-Type_Capture_%28signature%29
- 角色中的类型捕获:https://docs.perl6.org/language/typesystem#index-entry-Type_Capture_%28role%29
希望对您有所帮助!
我喜欢这样想的是 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 {…}
上面只接受一个实数(除了 Complex 之外的所有数字),将类型别名为 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] {…}