2016-03-05 30 views
9

我对这段代码感到困惑,我显然无法在字符串连接中调用WHAT方法?为什么Perl 6的字符串连接不像.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. 

回答

5

.WHAT返回一个类型的对象,一个未定义的对象

最喜欢的程序/操作符,连接假定它的参数定义。但是最后一行中的.WHAT返回一个类型对象,而未定义类型对象。所以结果是空字符串的警告和字符串化。


如果你想连接一个未定义的对象,而不会产生警告,而不是将其字符串化到对象的类型名称,则必须明确.^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) 
+0

它似乎真的坏了,它会在一些情况下,而不是其他人。 –

+0

这个想法是,如果你连接一个值,你期望它是一个适当的价值。如果你期望得到一个未定义的值,你会使用.perl和朋友(如果你想要“(Str)”)或。^ name(如果你想要“Str”)。 – timotimo

+0

@briandfoy我改写了我的答案。也许我的新答案会更有意义。 – raiph

6

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

。什么给你回一个类型,这是指如果你插警告或连接它或做数学与它

在你的例子中,$objectStr,所以$object.WHAT为您提供Str类型。

换句话说,它就像写:

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

编辑:看来你真正的问题是:“为什么不Perl 6的的字符串连接不喜欢的类型?”

正如其他人所提到的,类型是未定义的,并且连接在定义的值上工作。正如Perl 6的警告消息所述,您需要使用。^ name,.perl,.gist中的任何一个来将未定义的事物串联起来。

这两个会的工作,因为say使用.gist到字符串化:

say Str; 

say "The object is ", Str; 
+0

问题是,它在其他情况下串联。但是,去IRC发现语言古怪并不会帮助大多数人。 –

+1

我不知道这是否已经被驱动回家了,但'say $ object.WHAT;'不是简单地被串化。 'say'在它给出的对象上调用'.gist',因为'say'有义务以某种形式的人类可见格式表示对象。如果你需要使用'print'来代替字符串,并且你会看到它的行为一致。 –

+0

@Timbus,我明白,但想象一下,如果一个人的房间,他必须在前面解释这一点。对于人们来说,这是一个混乱的局面。 –

相关问题