2016-01-07 18 views
9

Sto leggendo questo fantastico introduction to Perl6 e sono imbattuto in un termine piuttosto interessante:Che cos'è un twigil in Perl6?

Annotare il !twigil significa “questo è privato alla classe”.

class ScoreKeeper { 
    has %!player-points; 
} 

so cosa sigils are in Perl5. Ma cos'è un twigil?

È solo un modo elegante per dire che ci sono due sigilli che precedono l'attributo/nome della variabile?

risposta

9

I documenti di progettazione e S02S99 sia parlare di twigils. (Enfasi mia).

I sigilli ordinari indicano le variabili con ambito normale, sia in versione lessicale che con il pacchetto . variabili con ambito Stranamente includono un sigillo secondario (una twigil) che indica che tipo di strano scoping la variabile è soggetto a: [...]

quindi è un sigillo secondaria o meglio una secondo sigillo. La dichiarazione $*foo non dichiarerà $foo.

my $*foo = 1; 
say $foo; 

Questo produrrà variabile '$ foo' non è dichiarato al ....

+3

Mi piacerebbe aggiungere che _lizmat_ su irc.perl.org mi ha aiutato a capire il concetto. – simbabque

8

Sembra essere collegato con scoping variabile:

Twigils influenzano la scoping di una variabile ...

Twigil Scope 
------ ---------------------------------------------- 
none  Based only on declarator 
*  Dynamic 
!  Attribute (class member) 
?  Compile-time variable 
.  Method (not really a variable) 
<  Index into match object (not really a variable) 
^  Self-declared formal positional parameter 
:  Self-declared formal named parameter 
=  Pod variables 
~  The sublanguage seen by the parser at this lexical spot 

http://doc.perl6.org/language/variables#Twigils

7

Da doc.perl6.org:

Gli attributi sono variabili esistenti per istanza di una classe. Essi possono essere direttamente accessibili dall'interno della classe tramite:

class Point { 
    has $.x; 
    has $.y; 

    method Str() { 
     "($!x, $!y)" 
    } 
} 

Si noti come gli attributi vengono dichiarati come $.x e $.y, ma sono ancora accessibili tramite $!x e $!y. Questo perché in Perl 6 tutti gli attributi sono privati ​​e si può accedere direttamente alla classe usando $!attribute-name. Perl 6 può però generare automaticamente metodi di accesso per te. Per maggiori dettagli su oggetti, classi e loro attributi vedi object orientation.

Gli attributi pubblici hanno il twigil ., quelli privati ​​il ​​! twigil.

class YourClass { 
    has $!private; 
    has @.public; 

    # and with write accessor 
    has $.stuff is rw; 

    method do_something { 
     if self.can('bark') { 
      say "Something doggy"; 
     } 
    } 
} 
+1

Wow, c'è uno shedload di loro nella documentazione! – Zaid