我对这段代码感到困惑,我显然无法WHAT在字符串连接中调用该方法?
my $object = 'Camelia';
say $object;
say $object.WHAT;
say "^name: The object is a " ~ $object.^name;
say "WHAT: The object is a " ~ $object.WHAT;
Run Code Online (Sandbox Code Playgroud)
输出显示调用^name作品(从元方法元模型:: ClassHOW),但Perl 6的被迷惑.WHAT,仿佛有一个优先问题.
Camelia
(Str)
^name: The object is a Str
Use of uninitialized value of type Str in string context
Any of .^name, .perl, .gist, or .say can stringify undefined things, if needed. in block <unit> at meta_methods.p6 line 7
WHAT: The object is a
Run Code Online (Sandbox Code Playgroud)
我的Perl 6:
This is Rakudo version 2015.12-219-gd67cb03 built on MoarVM version 2015.12-29-g8079ca5
implementing Perl 6.c.
Run Code Online (Sandbox Code Playgroud)
引用 Perl 6的IRC频道,用户FROGGS:
.WHAT会给你一个类型,如果你插入或连接它或用它做数学运算就会发出警告
在您的示例中,$object是a Str,因此$object.WHAT为您提供Str类型.
换句话说就像写作:
say "WHAT: The object is a " ~ Str;
Run Code Online (Sandbox Code Playgroud)
编辑:看起来你真正的问题是"为什么Perl 6的字符串连接不像类型?"
正如其他人所提到的,类型是未定义的,并且连接适用于定义的值.正如Perl 6的警告信息所示,您需要使用.^ name,.perl,.gist中的任何一个来对未定义的内容进行字符串化.
这两个将起作用,因为say用于.giststringify:
say Str;
say "The object is ", Str;
Run Code Online (Sandbox Code Playgroud)
.WHAT 返回一个类型对象,一个未定义的对象与大多数例程/运算符一样,连接假定其参数已定义.但是.WHAT在最后一行中返回一个类型对象,并且未定义类型对象.因此结果是对空字符串的警告和字符串化.
如果要连接未定义的对象而不生成警告,而是将其字符串化为对象的类型名称,则必须显式.^name,.gist或者.perl例如:
say "The object is a " ~ $object.^name
say "The object is a " ~ $object.WHAT.gist
Run Code Online (Sandbox Code Playgroud)
显示:
The object is a Str
The object is a (Str)
Run Code Online (Sandbox Code Playgroud)