2016-04-27 17 views
6

So che Swift ha nominato tuple:Perl 6 ha chiamato tuple?

let twostraws = (name: "twostraws", password: "fr0st1es") 

quindi posso dire:

print(twostraws.name) # twostraws 

ma in Perl 6 direi:

my $list = (twostraws, fr0st1es); 
say $list[0]; 

che non è così impressionante come Swift, quindi voglio sapere se ci sono tuple con nome in Perl 6?

+0

Stai cercando una Hashmap? – zb226

+0

@ zb226 'my $ name =" twostraws "; my $ password = "fr0st1es"; my $ list = (: nome ($ nome),: password ($ password)); dire $ lista [0] {'nome'}; ' è questo ** HashMap **? – chenyf

+0

È una [Lista] (https://doc.perl6.org/type/List) di [Coppia] (https://doc.perl6.org/type/Pair) s. Puoi vedere il tipo eseguendo per es. 'dì $ list [0] .WHAT;'. – zb226

risposta

10

Ci sono vari modi di ottenere qualcosa di simile.

  • hash semplice (scelta consigliata)

    my \twostraws = %('name' => 'twostraws', 'password' => 'fr0st1es'); 
    print twostraws<name>; # twostraws{ qw'name' } 
    
  • lista con due metodi misti in

    my \twostraws = ('twostraws', 'fr0st1es') but role { 
        method name () { self[0] } 
        method password() { self[1] } 
    } 
    
    put twostraws.name; # `put` is like `print` except it adds a newline 
    
  • classe anonima

    my \twostraws = class :: { 
        has ($.name, $.password) 
    }.new(:name('twostraws'), :password('fr0st1es')) 
    
    say twostraws.name; # `say` is like `put` but calls the `.gist` method 
    

Probabilmente ci sono un bel po 'di più che non ho ancora pensato. La vera domanda è come la userai nel resto del tuo codice.

+0

Wow, Perl 6 è così flessibile! – chenyf

+0

@chenyf In realtà puoi scrivere il tuo codice in qualsiasi lingua per cui qualcuno abbia scritto uno slang. (Quindi, in effetti, tutti gli altri linguaggi potrebbero essere considerati un sottoinsieme di Perl 6) Se stavi per scriverne molti potresti scrivere un operatore di circolarità per questo 'sub circumfix: <\' \'> (@ ($ name, $ password)) {% (: $ name,: $ password)}; di '\' 'twostraws', 'fr0st1es' \ '' –

4

Sembra che il tipo in Perl 6 che si sta cercando sia un hash.

Vedere la relativa documentazione:

Ecco un esempio di Perl 6 che dovrebbe essere equivalente a tuo esempio Swift:

my %twostraws = name => 'twostraws', password => 'fr0st1es'; 

print %twostraws<name>; # twostraws 
+0

Alcuni documenti supplementari: [Sintassi: "Stringhe letterali"] (https://doc.perl6.org/language/syntax#String_literals) (virgolette singole contro virgolette doppie in Perl 6). –

3

Il perl6 equivalente è il Pair type e il suo operatore di costruzione è =>. Sono immutabili - una volta creati la chiave e il valore non possono essere modificati;

$ perl6 
> my $destination = "Name" => "Sydney" ; 
Name => Sydney 
> say $destination.WHAT ; 
(Pair) 
> $destination.value = "London"; 
Cannot modify an immutable Str 
    in block <unit> at <unknown file> line 1 

> 

Come la "virgola grasso" dal perl5, il costruttore non richiede il lato sinistro da citare se si tratta di un unico identificatore. Esiste una sintassi alternativa per esprimere coppie chiamate "coppia di due punti". Puoi raccogliere un certo numero di coppie in una lista ma saranno accessibili solo posizionalmente;

> $destination = (Name => "Sydney" , :Direction("East") , :Miles(420)); 
(Name => Sydney Direction => East Miles => 420) 
> say $destination.WHAT ; 
(List) 
> say $destination[1] ; 
Direction => East 
> 

ci sono convenienti varianti della sintassi di coppia di due punti - se il valore è una stringa, è possibile sostituire le parentesi con parentesi angolari e rilasciare le virgolette. Se il valore è un numero intero, è possibile elencare immediatamente la chiave dopo il il valore senza virgolette. Se il valore è booleano, è possibile elencare la chiave da sola se il valore è True o con prefisso ! se il valore è False.

Infine, è possibile assegnare un numero di questi in un hash in cui è possibile accedere ai valori tramite chiave e sono modificabili;

> my %destination = (:Name<Sydney> , :Direction<East> , :420miles , :!visited) ; 
Direction => East, Name => Sydney, miles => 420, visited => False 
> say %destination<miles> ; 
420 
> %destination<visited> = True ; 
True 
> 
5

Le enumerazioni possono avere tipi di valore che non sono Int. Li dichiari come una lista di coppie.

enum Twostraws (name => "twostraws", password => "fr0st1es"); 
say name; # OUTPUT«twostraws␤» 
say password; # OUTPUT«fr0st1es␤» 
say name ~~ Twostraws, password ~~ Twostraws; # OUTPUT«TrueTrue␤» 
say name.key, ' ', name.value; # OUTPUT«name twostraws␤» 

Il tipo che viene dichiarato con enum può essere usato come qualsiasi altro tipo.

sub picky(Twostraws $p){ dd $p }; 
picky(password); # OUTPUT«Twostraws::password␤» 

Edit: vedi https://github.com/perl6/roast/blob/master/S12-enums/non-int.t