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 self
eller Me
) en variabel, der i instansmetoder bruges til at henvise til det objekt, de arbejder på. Det første OO -sprog, SIMULA 67 , bruges this
til 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: this
er 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 this
søgeordet. Når et objekt er korrekt konstrueret eller instantieret, this
er 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 this
gemt i det globale rum uden for dokumentobjektet; i den sammenhæng, this
vil referere til sideelementet i dokumentobjektet, ikke det omsluttende vindueobjekt.
På nogle sprog, for eksempel C ++ og Java, this
eller self
er 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 this
eller 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 &self
eller 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 cls
adgang til klasseobjektet .
Subtiliteter og vanskeligheder
Når leksikalsk scoping bruges til at udlede this
, kan brugen af this
in -code, selv om det ikke er ulovligt, rejse alarmklokker til en vedligeholdelsesprogrammerer, selvom der stadig er legitime anvendelser this
i 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. this
sig 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 this
markørparameter.
Åben rekursion
Udsendelsessemantikken this
, nemlig at metodeopkald this
sendes 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 this
for klarhed, men ikke nødvendig) this
binder 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 factorial
metoden 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 this
standarder 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
public
metoder tilthis
. - Kode, der kan genbruges internt (ved påkaldelse fra andre metoder i samme klasse) er indkapslet i en
protected
ellerprivate
metode; hvis det også skal udsættes direkte for brugerne, såpublic
kalder en indpakningsmetode den interne metode. - Den tidligere anbefaling kan lempes for rene metoder.
Implementeringer
C ++
Tidlige versioner af C ++ ville lade this
markø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 this
i 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, this
ville 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 this
i C# fungerer på samme måde som i Java, for referencetyper. Men inden for C # værdi typer , this
har helt andre semantik, at ligne en almindelig foranderlig variabel reference, og kan endda forekomme på venstre side af en opgave.
En brug af this
i 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 localAndFieldname
til 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 this
bruges søgeordet som en markør til forekomsten af objektet metoden er bundet til, mens det i D2 har karakteren af et implicit ref
funktionsargument.
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 Current
til at referere til den aktuelle klasse og dens funktioner. Brugen af søgeordet Current
er valgfri, da søgeordet Current
er 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 Current
ved opkaldet til simpel 'foo'.
Linje #10 (nedenfor) har den eksplicitte henvisning til Current
ved 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 Current
er 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 this
er 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, this
kan de aldrig være nul.
JavaScript
I JavaScript, som er et programmerings- eller scriptsprog, der bruges i vid udstrækning i webbrowsere, this
er 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,
this
refererer det til det omsluttende objekt, som i dette tilfælde er det omsluttende browservindue,window
objektet. - Når det bruges i en funktion, der er defineret i det globale rum,
this
afhænger hvad søgeordet refererer til, hvordan funktionen kaldes. Når en sådan funktion kaldes direkte (f.eks.f(x)
),this
Vil 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 detundefined
). Hvis en global funktion, der indeholderthis
, kaldes som en del af hændelsesbehandleren for et element i dokumentobjektet,this
vil det imidlertid referere til det kaldende HTML -element. - Når en metode kaldes ved hjælp af
new
søgeordet (f.eks.var c = new Thing()
)this
Henviser 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)
),this
Vil det referere til det objekt, som funktionen er indeholdt i. Det er endda muligt at angive manuelt,this
når der kaldes til en funktion, ved hjælp af funktionsobjektets.call()
eller.apply()
metoder. For eksempel kan metodeopkaldetobj.f(x)
også skrives somobj.f.call(obj, x)
.
For at omgå den forskellige betydning af this
indlejrede funktioner, såsom DOM -hændelseshåndterere, er det et almindeligt formsprog i JavaScript for at gemme this
referencen til det kaldende objekt i en variabel (almindeligvis kaldet that
eller 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 this
og 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 self
er 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 globalThis
søgeordet.
Lua
I Lua, self
oprettes 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, self
lader 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, $this
beskriver 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 classmethod
dekoratø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 staticmethod
dekoratø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 self
deres 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 self
parameter på en række forskellige måder og kan kaldes på en Foo
forekomst ved hjælp af dot-notation syntaksukker, hvilket svarer til at kalde det typekvalificerede funktionsnavn med en eksplicit self
fø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 ++
Self
bruges strengt inden for klassens metoder. En anden måde at henvise til Self
er at bruge ::
.
Se også
- Anonym rekursion - Rekursion uden at kalde en funktion ved navn
- Arv (objektorienteret programmering) -Mekanisme til at basere et objekt eller en klasse på et andet objekt eller en klasse, der bevarer lignende implementering
- Selvreference- Sætning, idé eller formel, der refererer til sig selv
- Skizofreni (objektorienteret programmering) -Komplikation som følge af delegation og relaterede teknikker inden for objektorienteret programmering
- Programsegment -præfiks - datastruktur i DOS
Referencer
Yderligere læsning
- Meyers, Scott, 1995. Mere effektiv C ++: 35 nye måder at forbedre dine programmer og designs . ISBN 0-201-63371-X Scott Meyers
- Stroustrup, Bjarne, 1994. Design og udvikling af C ++ . Addison-Wesley Pub. Co. ISBN 0-201-54330-3 Bjarne Stroustrup