2016-03-05 11 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)"を望むなら)または。 – timotimo

+0

@briandfoy私は答えを書き直しました。たぶん、私の新しい答えはもっと意味をなさないでしょう。 – raiph

6

A quoteはPerl 6のIRCチャンネル、ユーザーFROGGSから:

.WHATは、あなたが戻ってあなたが補間あれば警告することを意図しているタイプを与えますまたはそれをCONCATまたはそれ

あなたの例では、と数学を行いますはStrなので、$object.WHATStrとなります。

言い換えれば、それは書き込みのようだ:

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

これはすでに十分に動いているのかどうかは分かりませんが、 '$ object.WHAT;と言うと、単に文字列化されているだけではありません。 'say'は何らかの形で人間が見ることができる形式でオブジェクトを表現することを義務付けられているので、' say'は与えられたオブジェクトに対して '.gist'を呼び出しています。代わりに 'print'を使用するように文字列化する必要がある場合は、一貫して動作することがわかります。 –

+0

@Timbus、私はそれを理解していますが、人の部屋があればこれを前もって説明しなければならない人物であると想像してください。これは、人々が覚えておかなければならないちょっとした状況です。 –