2016-03-05 1 views
9

Sono confuso da questo frammento di codice in cui apparentemente non riesco a chiamare il metodo WHAT in una concatenazione di stringhe?Perché la concatenazione delle stringhe di Perl 6 non è come .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; 

L'output mostra che chiamando ^name opere (un metamethod da Metamodel::ClassHOW), ma Perl 6 è confuso da .WHAT come se ci fosse un problema di precedenza.

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 

mio Perl 6:

This is Rakudo version 2015.12-219-gd67cb03 built on MoarVM version 2015.12-29-g8079ca5 
implementing Perl 6.c. 

risposta

5

.WHAT restituisce un oggetto di tipo, un oggetto non definito

Come la maggior parte routines/operatori, la concatenazione assume i suoi argomenti sono definiti. Ma lo .WHAT nell'ultima riga restituisce un oggetto tipo e un oggetto tipo non è definito. Quindi il risultato è un avvertimento e una stringificazione alla stringa vuota.


Se si desidera concatenare un oggetto indefinito senza generare un messaggio di avviso e invece stringa i in nome del tipo di oggetto è necessario in modo esplicito .^name, .gist o .perl IT ad esempio:

say "The object is a " ~ $object.^name 
say "The object is a " ~ $object.WHAT.gist 

display:

The object is a Str 
The object is a (Str) 
+0

Sembra davvero rotto che si stringificherà in alcuni casi e non in altri. –

+0

l'idea è che se si concatena un valore, ci si aspetta che sia un valore appropriato. Se si prevede di ottenere un valore non definito, si useranno .perl e gli amici (se si desidera "(Str)") o.^Nome (se si desidera "Str"). – timotimo

+0

@briandfoy Ho riscritto la mia risposta. Forse la mia nuova risposta avrà più senso. – raiph

6

A quote dal canale IRC di Perl 6, Froggs utente:

.che ti restituisce un tipo, che ha lo scopo di mettere in guardia se interpolare o concatlo o fare matematica con esso

Nel tuo esempio, $object è un Str, quindi $object.WHAT ti dà il tipo Str.

In altre parole, è come la scrittura:

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

Edit: Sembra che la tua vera domanda è "Perché la concatenazione di stringhe di Perl 6 non come tipi?"

Come altri hanno già menzionato, i tipi non sono definiti e la concatenazione funziona su valori definiti. Come dice il messaggio di avvertimento di Perl 6, è necessario usare qualsiasi.^Nome, .perl, .gist per stringere le cose non definite.

Questi due funzionerà perché say usa .gist alla stringa i:

say Str; 

say "The object is ", Str; 
+0

Il problema è che si verifica in altri casi. Ma andare all'IRC per trovare le stranezze linguistiche non aiuterà la maggior parte delle persone. –

+1

Non so se questo è già stato portato a casa abbastanza, ma 'say $ object.WHAT;' non si limita semplicemente a essere unificato. 'say' sta chiamando' .gist' sull'oggetto che gli è stato dato, perché 'say' è obbligato a rappresentare gli oggetti in una qualche forma di formato visualizzabile dall'uomo. Se hai bisogno di stringify usa invece 'print', e vedrai che agirà in modo coerente. –

+0

@Timbus, lo capisco, ma immagina di essere il ragazzo che deve spiegare questo davanti a una stanza di persone. È una situazione un po 'disordinata per le persone da ricordare. –