为什么 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
在您的示例中,$object
是 Str
,因此 $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)
我对这段代码感到困惑,我显然无法在字符串连接中调用 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
在您的示例中,$object
是 Str
,因此 $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)