Operatör för omfattningsupplösning
Inom datorprogrammering är scope ett omslutande sammanhang där värden och uttryck associeras . Operatören för scope resolution hjälper till att identifiera och specificera det sammanhang som en identifierare refererar till, särskilt genom att ange ett namnområde . De specifika användningarna varierar mellan olika programmeringsspråk med begreppen omfattning. På många språk är scope resolution-operatorn skriven ::
.
I vissa språk, särskilt de som påverkas av Modula-3 (inklusive Python och Go ), är moduler objekt och omfångsupplösning inom moduler är ett specialfall av vanlig objektmedlemsåtkomst, så den vanliga metodoperatorn .
används för scope resolution. Andra språk, särskilt C++ och Ruby , har både scope-upplösning och metodåtkomst, som interagerar på olika sätt; se exempel nedan.
C++
klass A { public : static int i ; // omfattning av A }; namnutrymme B { int c = 2 ; } // namnområde B int A :: i = 4 ; // scope operator refererar till heltal i som deklarerats i klassen A int x = B :: c ; // scope operator hänvisar till heltal c som deklareras i namnrymden B
PHP
I PHP kallas scope resolution operatorn också Paamayim Nekudotayim ( hebreiska : פעמיים נקודותיים , uttalas [paʔaˈmajim nekudoˈtajim] , det andra ordet en vardagsförvanskning av סטיim, uttalas [nekudaˈtajim] ), vilket betyder "dubbelt kolon " på hebreiska.
Namnet "Paamayim Nekudotayim" introducerades i den israeliskt utvecklade Zend Engine 0.5 som används i PHP 3 . Även om det har varit förvirrande för många utvecklare som inte talar hebreiska, används det fortfarande i PHP 7, som i detta exempel på felmeddelande:
$ php -r :: Analysfel: syntaxfel, oväntat T_PAAMAYIM_NEKUDOTAYIM
Ett liknande fel kan också uppstå där ingen operatör för omfattningsupplösning finns. Ett försök att kontrollera om en konstant är tom() utlöser till exempel detta fel:
$ php -r 'define("foo", "bar"); if (empty(foo)) eko "tom";' Analysfel: syntaxfel, oväntat ')', väntar T_PAAMAYIM_NEKUDOTAYIM
Från och med PHP 5.4 innehåller felmeddelanden om scope resolution operator fortfarande detta namn, men har förtydligat dess betydelse något:
$ php -r :: Analysfel: syntaxfel, oväntat '::' (T_PAAMAYIM_NEKUDOTAYIM)
Det finns andra mindre uppenbara sätt att utlösa felet, till exempel genom att försöka använda följande ogiltiga PHP-uttryck:
$ php -r static const '$a=1' Analysfel: syntaxfel, oväntat filslut, väntar :: (T_PAAMAYIM_NEKUDOTAYIM)
Rubin
I Ruby kan scope-upplösning specificeras med hjälp av modulens nyckelord .
0
modul Exempelversion = 1 . _ class << self # Vi kommer åt modulens singleton class def hello ( who = "world" ) "Hello #{ who } " end end end #/Exempel Exempel :: hello # => "Hello world" Exempel . hej "hacker" # => "Hej hackare" Exempel :: Version # => 1.0 Exempel . Version # NoMethodError # Detta illustrerar skillnaden mellan meddelandeoperatorn (.) och scope-operatorn i Ruby (::) # Vi kan använda både ::hej och .hello, eftersom hej är en del av exempels omfattning och eftersom exempel # svarar till meddelandet hej. # # Vi kan inte göra detsamma med ::Version och .Version, eftersom Version är inom ramen för Exempel, men # Exempel kan inte svara på meddelandet Version, eftersom det inte finns någon metod att svara med.
Omfattning påverkas också av sigils som föregår variabelnamn:
- "
$
" - global variabel - "
@
" - instansvariabel avsjälv
- "
@@
" - klassvariabel - Ingen sigil, gemener eller understreck - lokal variabel eller metod
- Ingen sigil, versaler - konstant