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

bri*_*foy 10 perl6 raku

我对这段代码感到困惑,我显然无法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)

CIA*_*ash 6

引用 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)

  • @briandfoy:每个 Perl 6 值(在运行时)都有一个类型,包括未定义的值。(当你说 `my Str $x;` 时,`$x` 被初始化为 `Str` 类型的 undefined 值,而不是一个泛型的 'undefined' 值)。然后在运行时使用特定类型的未定义值来表示/引用该类型(而不是具有单独的值)。所以`$x.WHAT` 返回`undef`,但具有与`$x` 相同的(运行时)类型。然后,如果你在一个未定义的值上调用 `.new()`,它就像一个类方法一样 DWYW。 (2认同)

rai*_*iph 6

.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)