dette (computerprogrammering) - this (computer programming)

dette , selv , og Me er nøgleord anvendt i nogle computer programmeringssprog til at henvise til det objekt, klasse, eller en anden enhed, som i øjeblikket kører koden er en del af. Den enhed, der henvises til af disse søgeord, afhænger således af eksekveringskonteksten (f.eks. Hvilket objekt der har sin metode kaldet). Forskellige programmeringssprog bruger disse søgeord på lidt forskellige måder. På sprog, hvor et søgeord som "dette" er obligatorisk, er søgeordet den eneste måde at få adgang til data og metoder, der er gemt i det aktuelle objekt. Hvor det er valgfrit, kan de skelne variabler og funktioner med samme navn.

Objektorienteret programmering

I mange objektorienterede programmeringssprog er this(også kaldet selfeller Me) en variabel, der i instansmetoder bruges til at henvise til det objekt, de arbejder på. Det første OO -sprog, SIMULA 67 , bruges thistil eksplicit at henvise til det lokale objekt. C ++ og sprog, der stammer fra det (f.eks. Java , C# , D og PHP ) bruger også generelt this. Smalltalk og andre, såsom Object Pascal , Perl , Python , Ruby , Rust , Objective-C , DataFlex og Swift , brug self. Microsofts Visual Basic -anvendelser Me.

Begrebet ligner alle sprog: thiser normalt en uforanderlig reference eller markør, der refererer til det aktuelle objekt; det aktuelle objekt er ofte koden, der fungerer som 'forælder' til den ejendom , metode , underrutine eller funktion, der indeholder thissøgeordet. Når et objekt er korrekt konstrueret eller instantieret, thiser det altid en gyldig reference. Nogle sprog kræver det eksplicit; andre bruger leksikalsk scoping til implicit at bruge det til at synliggøre symboler inden for deres klasse. Eller alternativt kan det aktuelle objekt, der refereres til this, være et uafhængigt kodeobjekt, der har kaldt funktionen eller metoden, der indeholder søgeordet this. Sådan noget sker for eksempel, når en JavaScript -hændelseshandler, der er knyttet til et HTML -tag på en webside, kalder en funktion, der indeholder søgeordet, der er thisgemt i det globale rum uden for dokumentobjektet; i den sammenhæng, thisvil referere til sideelementet i dokumentobjektet, ikke det omsluttende vindueobjekt.

På nogle sprog, for eksempel C ++ og Java, thiseller selfer et nøgleord , og variablen eksisterer automatisk i forekomstmetoder. I andre, for eksempel Python, Rust og Perl 5, er den første parameter i en instansmetode en sådan reference. Det skal angives eksplicit. I Python og Perl behøver parameteren ikke nødvendigvis at blive navngivet thiseller self; den kan navngives frit af programmøren som enhver anden parameter. Men efter uformel konvention navngives den første parameter for en forekomstmetode i Perl eller Python self. Rust kræver, at selvobjektet kaldes &selfeller self, afhængigt af om den påkaldte funktion låner henholdsvis den påkaldende eller flytter den ind.

Statiske metoder i C ++ eller Java er ikke forbundet med forekomster, men klasser, og kan derfor ikke bruges this, fordi der ikke er noget objekt. På andre sprog, såsom Ruby, Smalltalk, Objective-C eller Swift, er metoden forbundet med et klasseobjekt , der sendes som this, og de kaldes klassemetoder . For klassemetoder bruger Python clsadgang til klasseobjektet .

Subtiliteter og vanskeligheder

Når leksikalsk scoping bruges til at udlede this, kan brugen af thisin -code, selv om det ikke er ulovligt, rejse alarmklokker til en vedligeholdelsesprogrammerer, selvom der stadig er legitime anvendelser thisi dette tilfælde, f.eks. At henvise til instansvariabler, der er skjult af lokale variabler af samme navn, eller hvis metoden ønsker at returnere en reference til det aktuelle objekt, dvs. thissig selv.

I nogle kompilatorer (f.eks. GCC ) kan pointer til C ++ - forekomstmetoder direkte castes til en markør af en anden type med en eksplicit thismarkørparameter.

Åben rekursion

Udsendelsessemantikken this, nemlig at metodeopkald thissendes dynamisk, er kendt som åben rekursion og betyder, at disse metoder kan tilsidesættes af afledte klasser eller objekter. Derimod bruger direkte navngivet rekursion eller anonym rekursion af en funktion lukket rekursion med tidlig binding. For eksempel er token i den følgende Perl -kode for fabrikken __SUB__en reference til den aktuelle funktion:

use feature ":5.16";
sub {
    my $x = shift;
    $x == 0 ? 1 : $x * __SUB__->( $x - 1 );
}

I C ++ derimod (ved hjælp af en eksplicit thisfor klarhed, men ikke nødvendig) thisbinder det sig til selve objektet, men hvis klassemetoden blev erklæret "virtuel" dvs. polymorf i basen, løses det via dynamisk forsendelse ( sen binding ), så afledte klasser kan tilsidesætte det.

unsigned int factorial(unsigned int n)
{
  if (n == 0)
    return 1;
  else
    return n * this->factorial(n - 1);
}

Dette eksempel er kunstigt, da dette er direkte rekursion, så tilsidesættelse af factorialmetoden ville tilsidesætte denne funktion; mere naturlige eksempler er, når en metode i en afledt klasse kalder den samme metode i en basisklasse eller i tilfælde af gensidig rekursion.

Det skrøbelige grundklasseproblem har fået skylden for åben rekursion med det forslag, at man påberåber thisstandarder til lukket rekursion (statisk afsendelse, tidlig binding) frem for åben rekursion (dynamisk afsendelse, sen binding), kun ved hjælp af åben rekursion, når det specifikt er anmodet; eksterne opkald (bruger ikke this) ville blive dynamisk sendt som normalt. Den måde, det løses i praksis på i JDK, er gennem en bestemt programmeringsdisciplin; denne disciplin er blevet formaliseret af C. Ruby og GT Leavens; det består dybest set af følgende regler:

  • Ingen kode påkalder publicmetoder til this.
  • Kode, der kan genbruges internt (ved påkaldelse fra andre metoder i samme klasse) er indkapslet i en protectedeller privatemetode; hvis det også skal udsættes direkte for brugerne, så publickalder en indpakningsmetode den interne metode.
  • Den tidligere anbefaling kan lempes for rene metoder.

Implementeringer

C ++

Tidlige versioner af C ++ ville lade thismarkøren ændres; ved at gøre det kunne en programmør ændre, hvilket objekt en metode arbejdede på. Denne funktion blev til sidst fjernet, og nu thisi C ++ er en r-værdi .

Tidlige versioner af C ++ inkluderede ikke referencer, og det er blevet foreslået, at hvis de havde været det i C ++ fra begyndelsen, thisville det have været en reference, ikke en pointer.

C ++ lader objekter ødelægge sig selv med kildekoden erklæring: delete this.

C#

Søgeordet thisi C# fungerer på samme måde som i Java, for referencetyper. Men inden for C # værdi typer , thishar helt andre semantik, at ligne en almindelig foranderlig variabel reference, og kan endda forekomme på venstre side af en opgave.

En brug af thisi C# er at tillade reference til en ydre feltvariabel inden for en metode, der indeholder en lokal variabel, der har samme navn. I en sådan situation vil for eksempel sætningen var n = localAndFieldname;inden for metoden tildele typen og værdien af ​​den lokale variabel localAndFieldnametil n, hvorimod sætningen var n = this.localAndFieldname;vil tildele typen og værdien af ​​den ydre feltvariabel til n.

D

I D this i en klasse refererer struktur eller foreningsmetode til en uforanderlig reference til forekomsten af ​​det omsluttende aggregat. Klasser er referencetyper , strukturer og fagforeninger er værdityper. I den første version af D thisbruges søgeordet som en markør til forekomsten af ​​objektet metoden er bundet til, mens det i D2 har karakteren af ​​et implicit reffunktionsargument.

Dylan

I programmeringssproget Dylan , som er et objektorienteret sprog, der understøtter multimetoder og ikke har et begreb om this, sendes en besked til et objekt stadig i syntaksen. De to former nedenfor fungerer på samme måde; forskellene er bare syntaktisk sukker .

object.method(param1, param2)

og

method (object, param1, param2)

Eiffel

Inden for en klassetekst er den aktuelle type den type, der er hentet fra den aktuelle klasse . Inden for funktioner (rutiner, kommandoer og forespørgsler) i en klasse kan man bruge søgeordet Currenttil at referere til den aktuelle klasse og dens funktioner. Brugen af ​​søgeordet Currenter valgfri, da søgeordet Currenter underforstået ved ganske enkelt at henvise til navnet på den aktuelle klassefunktion åbent. For eksempel: Man kan have en funktion 'foo' i en klasse MY_CLASS og henvise til den ved:

  class
     MY_CLASS
  
  feature -- Access
  
     foo: INTEGER
  
     my_function: INTEGER
        do
          Result := foo
       end
 
 end

Linje #10 (ovenfor) har den underforståede henvisning til Currentved opkaldet til simpel 'foo'.

Linje #10 (nedenfor) har den eksplicitte henvisning til Currentved opkaldet til 'Current.foo'.

  class
     MY_CLASS
  
  feature -- Access
  
     foo: INTEGER
  
     my_function: INTEGER
        do
           Result := Current.foo
       end
 
 end

Enten tilgang er acceptabel for kompilatoren, men den underforståede version (f.eks. x := foo) Foretrækkes, da den er mindre omfattende.

Som med andre sprog er der tidspunkter, hvor brugen af ​​søgeordet Currenter obligatorisk, såsom:

  class
     MY_CLASS
  
  feature -- Access
  
     my_command
           -- Create MY_OTHER_CLASS with `Current'
        local
           x: MY_OTHER_CLASS
       do
          create x.make_with_something (Current)
       end
 
 end

I tilfælde af koden ovenfor passerer opkaldet på linje #11 til make_with_something den nuværende klasse ved eksplicit at passere søgeordet Current.

Java

Nøgleordet thiser et Java -sprogligt søgeord, der repræsenterer den aktuelle forekomst af klassen, hvor det vises. Det bruges til at få adgang til klassevariabler og metoder.

Da alle instansmetoder er virtuelle i Java, thiskan de aldrig være nul.

JavaScript

I JavaScript, som er et programmerings- eller scriptsprog, der bruges i vid udstrækning i webbrowsere, thiser et vigtigt søgeord, selv om det, det evalueres til, afhænger af, hvor det bruges.

  • Når det bruges uden for en hvilken som helst funktion, i globalt rum, thisrefererer det til det omsluttende objekt, som i dette tilfælde er det omsluttende browservindue, windowobjektet.
  • Når det bruges i en funktion, der er defineret i det globale rum, thisafhænger hvad søgeordet refererer til, hvordan funktionen kaldes. Når en sådan funktion kaldes direkte (f.eks. f(x)), thisVil den referere tilbage til det globale rum, hvor funktionen er defineret, og hvor andre globale funktioner og variabler også kan eksistere (eller i streng tilstand er det undefined). Hvis en global funktion, der indeholder this, kaldes som en del af hændelsesbehandleren for et element i dokumentobjektet, thisvil det imidlertid referere til det kaldende HTML -element.
  • Når en metode kaldes ved hjælp af newsøgeordet (f.eks. var c = new Thing()) thisHenviser inden for Thing til selve Thing -objektet.
  • Når en funktion er knyttet som en egenskab for et objekt og kaldes som en metode til det objekt (f.eks. obj.f(x)), thisVil det referere til det objekt, som funktionen er indeholdt i. Det er endda muligt at angive manuelt, thisnår der kaldes til en funktion, ved hjælp af funktionsobjektets .call()eller .apply()metoder. For eksempel kan metodeopkaldet obj.f(x)også skrives som obj.f.call(obj, x).

For at omgå den forskellige betydning af thisindlejrede funktioner, såsom DOM -hændelseshåndterere, er det et almindeligt formsprog i JavaScript for at gemme thisreferencen til det kaldende objekt i en variabel (almindeligvis kaldet thateller self) og derefter bruge variablen til at henvise til opkaldet objekt i indlejrede funktioner.

For eksempel:

// In this example $ is a reference to the jQuery library 
$(".element").hover(function() {
    // Here, both this and that point to the element under the mouse cursor.
    var that = this;
    
    $(this).find('.elements').each(function() {
        // Here, this points to the DOM element being iterated.
        // However, that still points to the element under the mouse cursor.
        $(this).addClass("highlight");
    });
});

Navnlig gør JavaScript brug af begge thisog det relaterede søgeord self(i modsætning til de fleste andre sprog, der har tendens til at anvende det ene eller det andet), idet det selfer begrænset specifikt til webarbejdere.

Endelig, som en pålidelig måde til specifikt at referere til det globale (vindue eller tilsvarende) objekt, indeholder JavaScript globalThissøgeordet.

Lua

I Lua, selfoprettes som syntaktisk sukker, når funktioner defineres ved hjælp af :operatoren. Når man påberåber en metode ved hjælp af :, vil objektet, der indekseres, implicit blive givet som det første argument til den funktion, der påberåbes.

For eksempel er følgende to funktioner ækvivalente:

local obj = {}

function obj.foo(arg1, arg2)
  print(arg1, arg2) -- cannot use "self" here
end

function obj:bar(arg)
  print(self, arg) -- "self" is an implicit first argument before arg
end

-- All functions can be invoked both ways, with "." or with ":"

obj:foo("Foo") -- equivalent to obj.foo(obj, "Foo")
obj.bar(obj, "Bar") -- equivalent to obj:bar("Bar")

Lua i sig selv er ikke objektorienteret, men når det kombineres med en anden funktion kaldet metatables, selflader brugen af programmerere definere funktioner på en måde, der ligner objektorienteret programmering.

PowerShell

I PowerShell indeholder den særlige automatiske variabel $_ det aktuelle objekt i pipeline -objektet. Du kan bruge denne variabel i kommandoer, der udfører en handling på hvert objekt eller på udvalgte objekter i en pipeline.

"one", "two", "three" | % { write $_ }

Fra og med PowerShell 5.0, der tilføjer en formel syntaks til at definere klasser og andre brugerdefinerede typer, $thisbeskriver variabel den aktuelle forekomst af objektet.

Python

I Python er der ikke noget søgeord for this. Når en medlemsfunktion kaldes på et objekt, påkalder den medlemsfunktionen med samme navn på objektets klasseobjekt, med objektet automatisk bundet til funktionens første argument. Således fungerer den obligatoriske første parameter i forekomstmetoder som this; denne parameter kaldes konventionelt self, men kan navngives hvad som helst.

I klassemetoder (oprettet med classmethoddekoratøren) refererer det første argument til selve klasseobjektet og kaldes konventionelt cls; disse bruges primært til arvelige konstruktører, hvor brugen af ​​klassen som parameter gør det muligt at subklasse konstruktøren. I statiske metoder (oprettet med staticmethoddekoratøren) eksisterer der ikke noget særligt første argument.

Rust

I Rust erklæres typer adskilt fra de funktioner, der er forbundet med dem. Funktioner designet til at være analoge med instansmetoder på mere traditionelt objektorienterede sprog skal eksplicit tage selfderes første parameter. Disse funktioner kan derefter kaldes ved hjælp af instance.method()syntaksukker. For eksempel:

struct Foo {
    bar: i32,
}

impl Foo {
    fn new() -> Foo {
        Foo { bar: 0, }
    }
    fn refer(&self) {
        println!("{}", self.bar);
    }
    fn mutate(&mut self, baz: i32) {
        self.bar = baz;
    }
    fn consume(self) {
        self.refer();
    }
}

Dette definerer en type Foo, som har fire tilknyttede funktioner. Den første,, Foo::new()er ikke en forekomstfunktion og skal angives med typepræfikset. De resterende tre tager alle en selfparameter på en række forskellige måder og kan kaldes på en Fooforekomst ved hjælp af dot-notation syntaksukker, hvilket svarer til at kalde det typekvalificerede funktionsnavn med en eksplicit selfførste parameter.

let foo = Foo::new(); // must called as a type-specified function
foo.refer(); // prints "0". Foo::refer() has read-only access to the foo instance
foo.mutate(5); // mutates foo in place, permitted by the &mut specification
foo.consume(); // prints "5" and destroys foo, as Foo::consume() takes full ownership of self

//  equivalent to foo.refer()
Foo::refer(foo); // compilation error: foo is out of scope

Selv

Den Self sprog er opkaldt efter denne brug af "selv".

Xbase ++

Selfbruges strengt inden for klassens metoder. En anden måde at henvise til Selfer at bruge ::.

Se også

Referencer

Yderligere læsning