2016-03-05 28 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,我明白,但想象一下,如果一個人的房間,他必須在前面解釋這一點。對於人們來說,這是一個混亂的局面。 –

相關問題