为什么 Perl 6 的字符串连接不像 .WHAT?

Why does Perl 6's string concatenation not like .WHAT?

我对这段代码感到困惑,我显然无法在字符串连接中调用 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;

输出显示调用 ^name 有效(来自 Metamodel::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

我的 Perl 6:

This is Rakudo version 2015.12-219-gd67cb03 built on MoarVM version 2015.12-29-g8079ca5
implementing Perl 6.c.

A quote 来自 Perl 6 的 IRC 频道,用户 FROGGS:

.WHAT gives you back a type, which is meant to warn if you interpolate or concat it or do math with it

在您的示例中,$objectStr,因此 $object.WHAT 为您提供 Str 类型。

换句话说就像写作:

say "WHAT: The object is a " ~ Str;

编辑:看来你真正的问题是 "Why does Perl 6's string concatenation not like types?"

正如其他人所提到的,类型是未定义的,连接适用于已定义的值。正如 Perl 6 的警告消息所说,您需要使用 .^name、.perl、.gist 中的任何一个来对未定义的内容进行字符串化。

这两个可以工作,因为 say 使用 .gist 进行字符串化:

say Str;

say "The object is ", Str;

.WHAT returns类型对象,未定义对象

与大多数 routines/operators 一样,串联假定其参数已定义。但是你最后一行的 .WHAT returns a type object 和 a type object 没有定义。所以结果是对空字符串的警告和字符串化。


如果您想在不生成警告的情况下连接未定义的对象,而是将其字符串化为对象的类型名称,您必须显式 .^name.gist.perl,例如:

say "The object is a " ~ $object.^name
say "The object is a " ~ $object.WHAT.gist

显示:

The object is a Str
The object is a (Str)