Toto (počítačové programování) - This (computer programming)
tento, já, a Mě jsou klíčová slova použitý v nějakém počítači programovací jazyky odkazovat na objekt, třídu nebo jinou entitu, jejíž součástí je aktuálně spuštěný kód. Subjekt označovaný těmito klíčovými slovy tedy závisí na kontext provádění (například jaký objekt má svoji metodu nazvanou). Různé programovací jazyky používají tato klíčová slova mírně odlišnými způsoby. V jazycích, kde je klíčové slovo jako „toto“ povinné, je klíčové slovo jediným způsobem přístupu k datům a metodám uloženým v aktuálním objektu. Pokud je to volitelné, mohou disambiguovat proměnné a funkce se stejným názvem.
Objektově orientované programování
V mnoha objektově orientovaný programovací jazyky, tento
(také zvaný já
nebo Mě
) je proměnná, která se používá v instance metody odkazovat na objekt, na kterém pracují. První OO jazyk, SIMULA 67, použitý tento
výslovně odkazovat na místní objekt.[1]:4.3.2.3 C ++ a jazyky, které z toho odvozují styl (např Jáva, C#, D, a PHP ) také obecně používat tento
. Pokec a další, jako např Objekt Pascal, Perl, Krajta, Rubín, Rez, Cíl-C, DataFlex a Rychlý, použijte já
. Microsoft Visual Basic používá Mě
.
Koncept je podobný ve všech jazycích: tento
je obvykle neměnný odkaz nebo ukazatel který odkazuje na aktuální objekt; aktuální objekt je často kód, který funguje jako „rodič“ pro vlastnictví, metoda, dílčí rutina nebo funkce, která obsahuje tento
klíčové slovo. Poté, co je objekt správně sestaven nebo vytvořen tento
je vždy platný odkaz. Některé jazyky to výslovně vyžadují; ostatní používají lexikální obor implicitně jej použít ke zviditelnění symbolů v rámci své třídy. Nebo alternativně aktuální objekt, na který odkazuje tento
může být nezávislý objekt kódu, který zavolal funkci nebo metodu obsahující klíčové slovo tento
. Taková věc se stane, například když a JavaScript obslužná rutina události připojená ke značce HTML na webové stránce volá funkci obsahující klíčové slovo tento
uloženy v globálním prostoru mimo objekt dokumentu; v této souvislosti tento
bude odkazovat na prvek stránky v objektu dokumentu, nikoli na objekt uzavírajícího okna.[2]
V některých jazycích, například C ++ a Java, tento
nebo já
je klíčové slovo a proměnná automaticky existuje v metodách instance. Například v jiných Krajta, Rez, a Perl 5, první parametr metody instance je takový odkaz. Musí být výslovně specifikováno. V Pythonu a Perlu nemusí být parametr nutně pojmenován tento
nebo já
; programátor jej může volně pojmenovat jako každý jiný parametr. Neformální konvencí je však pojmenován první parametr metody instance v Perlu nebo Pythonu já
. Rust vyžaduje, aby byl vyvolán vlastní objekt &já
nebo já
, v závislosti na tom, zda si vyvolaná funkce půjčí fakturant, nebo jej přesune.
Statické metody v C ++ nebo Jáva nejsou spojeny s instancemi, ale třídami, a proto je nelze použít tento
, protože tam není žádný objekt. V jiných jazycích, například Rubín, Pokec, Cíl-C nebo Rychlý, metoda je spojena s a objekt třídy to je předáno jako tento
a jsou voláni třídní metody. Pro třídní metody, Krajta používá cls
pro přístup k objekt třídy.
Jemnosti a obtíže
Když se k odvození používá lexikální scoping tento
, použití tento
v kódu, i když to není nezákonné, může upozornit programátora údržby na varovné zvony, i když stále existují legitimní použití tento
v tomto případě, například odkaz na proměnné instance skryté místními proměnnými se stejným názvem, nebo pokud chce metoda vrátit odkaz na aktuální objekt, tj. tento
, sám.
V některých kompilátorech (například GCC ), ukazatele na metody instance C ++ lze přímo přetypovat na ukazatel jiného typu, s explicitní tento
parametr ukazatele.[3]
Otevřená rekurze
Sémantika expedice tento
, konkrétně tato metoda vyžaduje tento
jsou dynamicky odesílány, je známé jako otevřená rekurze, a znamená, že tyto metody lze přepsat odvozenými třídami nebo objekty. Naproti tomu přímá pojmenovaná rekurze nebo anonymní rekurze použití funkce uzavřená rekurze, s včasnou vazbou. Například v následujícím Perl kód pro faktoriál, token __SUB__
je odkaz na aktuální funkci:
použití Vlastnosti ":5.16";sub { můj $ x = posun; $ x == 0 ? 1 : $ x * __SUB__->( $ x - 1 );}
Naproti tomu v C ++ (pomocí explicitní tento
z důvodu jasnosti, i když to není nutné) tento
váže se na samotný objekt, ale pokud byla metoda třídy prohlášena za „virtuální“, tj. v základu polymorfní, je vyřešena prostřednictvím dynamického odeslání (pozdní vazba ), aby jej odvozené třídy mohly přepsat.
nepodepsaný int faktoriál(nepodepsaný int n){ -li (n == 0) vrátit se 1; jiný vrátit se n * tento->faktoriál(n - 1);}
Tento příklad je umělý, protože se jedná o přímou rekurzi, tedy přepsání faktoriál
metoda by přepsala tuto funkci; přirozenější příklady jsou, když metoda v odvozené třídě volá stejnou metodu v základní třídě nebo v případech vzájemné rekurze.[4][5]
The křehká základní třída problém byl obviňován z otevřené rekurze s návrhem, že vyvolání metod tento
výchozí pro uzavřenou rekurzi (statické odeslání, časná vazba) spíše než otevřená rekurze (dynamické odeslání, pozdní vazba), pouze s použitím otevřené rekurze, když je to výslovně požadováno; externí hovory (nepoužívají se) tento
) by bylo dynamicky odesláno jako obvykle.[6][7] To je v JDK v praxi řešeno prostřednictvím určité programátorské disciplíny; tuto disciplínu formalizovali C. Ruby a G. T. Leavens; v zásadě se skládá z následujících pravidel:[8]
- Žádný kód nevyvolává
veřejnost
metody natento
. - Kód, který lze interně znovu použít (vyvoláním z jiných metod stejné třídy), je zapouzdřen v a
chráněný
nebosoukromé
metoda; pokud to musí být vystaveno přímo uživatelům také, pak obálkaveřejnost
metoda volá interní metodu. - Předchozí doporučení lze uvolnit čistý metody.
Implementace
C ++
Starší verze C ++ by umožnily tento
ukazatel se změní; tím by programátor mohl změnit, na který objekt metoda pracuje. Tato funkce byla nakonec odstraněna a nyní tento
v C ++ je r-hodnota.[9]
Starší verze C ++ neobsahovaly odkazy a bylo navrženo, že kdyby tomu tak bylo C ++ od začátku, tento
byl by odkazem, ne ukazatelem.[10]
C ++ umožňuje objektům zničit se pomocí příkazu zdrojového kódu: toto smazat
.
C#
Klíčové slovo tento
v C# funguje stejně jako v Javě, pro referenční typy. V rámci C # typy hodnot, tento
má zcela odlišnou sémantiku, podobnou obyčejné proměnlivé proměnné, a může se dokonce vyskytnout na levé straně přiřazení.
Jedno použití tento
v C # je umožnit odkaz na proměnnou vnějšího pole v rámci metody, která obsahuje místní proměnnou se stejným názvem. V takové situaci například prohlášení var n = localAndFieldname;
v rámci metody přiřadí typ a hodnotu místní proměnné localAndFieldname
na n
, zatímco prohlášení var n = this.localAndFieldname;
přiřadí typ a hodnotu proměnné vnějšího pole n
.[11]
D
v D tento
ve třídě, struktuře nebo metodě sjednocení odkazuje na neměnný odkaz na instanci uzavírajícího agregátu. Třídy jsou odkaz typy, struktury a odbory jsou typy hodnot. V první verzi D klíčové slovo tento
se používá jako ukazatel na instanci objektu, na který je metoda vázána, zatímco v D2 má charakter implicitní ref
argument funkce.
Dylan
V programovacím jazyce Dylan, což je objektově orientovaný jazyk, který podporuje multimetody a nemá koncept tento
, odeslání zprávy objektu je stále udržováno v syntaxi. Dvě níže uvedené formy fungují stejným způsobem; rozdíly jsou spravedlivé syntaktický cukr.
metoda objektu (param1, param2)
a
metoda (objekt, param1, param2)
Eiffelova
V textu třídy je aktuální typ je typ získaný z aktuální třída. V rámci funkcí (rutiny, příkazy a dotazy) třídy lze použít klíčové slovo Proud
odkazovat na aktuální třídu a její vlastnosti. Použití klíčového slova Proud
je volitelné jako klíčové slovo Proud
je implikováno pouhým otevřeným odkazem na název aktuálního prvku třídy. Například: Jeden může mít funkci `foo 've třídě MY_CLASS a odkazovat se na ni pomocí:
1 třída 2 MOJE TŘÍDA 3 4 Vlastnosti -- Přístup 5 6 foo: CELÉ ČÍSLO 7 8 moje_funkce: CELÉ ČÍSLO 9 dělat10 Výsledek := foo11 konec12 13 konec
Řádek č. 10 (výše) má implicitní odkaz na Proud
voláním jednoduchého `foo '.
Řádek č. 10 (níže) má výslovný odkaz na Proud
voláním na `Current.foo '.
1 třída 2 MOJE TŘÍDA 3 4 Vlastnosti -- Přístup 5 6 foo: CELÉ ČÍSLO 7 8 moje_funkce: CELÉ ČÍSLO 9 dělat10 Výsledek := Proud.foo11 konec12 13 konec
Buď přístup je pro kompilátor přijatelný, ale implicitní verze (např. x: = foo
) je upřednostňován, protože je méně podrobný.
Stejně jako v jiných jazycích existují chvíle, kdy je použití klíčového slova Proud
je pověřen, například:
1 třída 2 MOJE TŘÍDA 3 4 Vlastnosti -- Přístup 5 6 můj_příkaz 7 - Vytvořte MY_OTHER_CLASS s `Aktuální ' 8 místní 9 X: MY_OTHER_CLASS10 dělat11 vytvořit X.udělat_s_ něčím (Proud)12 konec13 14 konec
V případě výše uvedeného kódu volání na lince # 11 do udělat_s_ něčím předává aktuální třídu výslovným předáním klíčového slova Proud
.
Jáva
Klíčové slovo tento
je Jáva klíčové slovo jazyka, které představuje aktuální instanci třídy, ve které se objevuje. Používá se pro přístup k proměnným třídy a metodám.
Jelikož jsou všechny instance metody v Javě virtuální, tento
nikdy nemůže být null.[13]
JavaScript
V JavaScriptu, což je programovací nebo skriptovací jazyk značně používáno ve webových prohlížečích, tento
je důležité klíčové slovo, i když to, co vyhodnotí, závisí na tom, kde je použito.
- Při použití mimo jakoukoli funkci v globálním prostoru
tento
odkazuje na uzavírající objekt, kterým je v tomto případě uzavírající okno prohlížeče,okno
objekt. - Při použití ve funkci definované v globálním prostoru, jaké klíčové slovo
tento
odkazuje na závisí na tom, jak se funkce nazývá. Když je taková funkce volána přímo (např.f (x)
),tento
bude odkazovat zpět na globální prostor, ve kterém je funkce definována a ve kterém mohou také existovat další globální funkce a proměnné (nebo v přísném režimu jenedefinováno
). Pokud globální funkce obsahujetento
se nazývá jako součást obslužné rutiny události prvku v objektu dokumentu, nicménětento
bude odkazovat na volající prvek HTML. - Když je metoda volána pomocí
Nový
klíčové slovo (např.var c = nová věc ()
) pak v rámci Věcitento
odkazuje na samotný objekt věc. - Když je funkce připojena jako vlastnost objektu a volána jako metoda daného objektu (např.
obj.f (x)
),tento
bude odkazovat na objekt, ve kterém je funkce obsažena.[14][15] Je dokonce možné zadat ručnětento
při volání funkce pomocí.volání()
nebo.aplikovat()
metody funkčního objektu.[16] Například volání metodyobj.f (x)
lze také napsat jakoobj.f.call (obj, x)
.
Chcete-li obejít jiný význam tento
ve vnořených funkcích, jako jsou obslužné rutiny událostí DOM, je v JavaScriptu běžný idiom pro uložení tento
odkaz na volající objekt v proměnné (běžně nazývané že
nebo já
), a poté použijte proměnnou k odkazu na volající objekt ve vnořených funkcích.
Například:
// V tomto příkladu je $ odkaz na knihovnu jQuery $(".živel").vznášet se(funkce() { // Tady, to i ono ukazuje na prvek pod kurzorem myši. var že = tento; $(tento).nalézt('.elementy').každý(funkce() { // Zde to ukazuje na iterovaný prvek DOM. // To však stále ukazuje na prvek pod kurzorem myši. $(tento).addClass("zvýraznit"); });});
Lua
V Lua, já
je vytvořen jako syntaktický cukr když jsou funkce definovány pomocí :
operátor.[17] Při vyvolání metody pomocí :
, indexovaný objekt bude implicitně dán jako první argument vyvolávané funkce.
Například následující dvě funkce jsou ekvivalentní:
místní obj = {}funkce obj.foo(arg1, arg2) tisk(arg1, arg2) - zde nelze použít "já"konecfunkce obj:bar(arg) tisk(já, arg) - "já" je implicitní první argument před argkonec- Všechny funkce lze vyvolat oběma způsoby, pomocí „.“ nebo s „:“obj:foo("Foo") - ekvivalent obj.foo (obj, "Foo")obj.bar(obj, "Bar") - ekvivalent obj: bar ("Bar")
Lua sama o sobě není objektově orientovaná, ale v kombinaci s další funkcí zvanou metatables je použití já
umožňuje programátorům definovat funkce způsobem podobným objektově orientovanému programování.
PowerShell
V PowerShellu speciální automatická proměnná $_
obsahuje aktuální objekt v objektu potrubí. Tuto proměnnou můžete použít v příkazech, které provádějí akci na každém objektu nebo na vybraných objektech v potrubí.[18]
"jeden", "dva", "tři" | % { psát si $_ }
Počínaje také PowerShell 5.0, který přidává formální syntaxi k definování tříd a dalších typů definovaných uživatelem[19], $ toto
proměnná popisuje aktuální instanci objektu.
Krajta
V Pythonu neexistuje žádné klíčové slovo pro tento
. Když je členská funkce volána na objektu, vyvolá členské funkci se stejným názvem na objekt třídy objektu, přičemž objekt je automaticky vázán na první argument funkce. Tedy povinný první parametr instance metody slouží jako tento
; tento parametr je konvenčně pojmenován já
, ale lze jej pojmenovat cokoli.
Ve třídních metodách (vytvořených pomocí metoda třídy
decorator), první argument odkazuje na samotný objekt třídy a je konvenčně nazýván cls
; primárně se používají pro dědičné konstruktory,[20] kde použití třídy jako parametru umožňuje podtřídu konstruktoru. Ve statických metodách (vytvořených pomocí statická metoda
decorator), neexistuje žádný speciální první argument.
Rez
V Rustu jsou typy deklarovány odděleně od funkcí s nimi spojených. Funkce navržené tak, aby byly analogické s instančními metodami ve více tradičně objektově orientovaných jazycích, musí explicitně trvat já
jako jejich první parametr. Tyto funkce lze poté volat pomocí instance.method ()
syntaxe cukru. Například:
struktur Foo{bar: i32,}implFoo{fn Nový()-> Foo{Foo{bar: 0,}}fn viz(&já){tisk!("{}",já.bar);}fn mutovat(&mutjá,baz: i32){já.bar=baz;}fn konzumovat(já){já.viz();}}
To definuje typ, Foo
, který má čtyři přidružené funkce. První, Foo :: nový ()
, není instanční funkcí a musí být zadána s předponou typu. Zbývající tři všichni berou a já
parametr různými způsoby a lze jej vyvolat na a Foo
instance používající syntaxi dot-notation syntaxe, která je ekvivalentní volání názvu funkce kvalifikovaného typu s explicitním já
první parametr.
nechatfoo=Foo::Nový();// musí být volána jako typově specifická funkcefoo.viz();// vypíše „0“. Foo :: refer () má přístup jen pro čtení k instanci foofoo.mutovat(5);// mutuje foo na místě, povoleno specifikací & mutfoo.konzumovat();// vytiskne „5“ a zničí foo, protože Foo :: consume () přebírá plné vlastnictví sebe sama// ekvivalent foo.refer ()Foo::viz(foo);// chyba kompilace: foo je mimo rozsah
Já
The Já jazyk je pojmenován po tomto použití „já“.
Xbase ++
Já
je přísně používán v rámci metod třídy. Další způsob, jak odkazovat Já
je použít ::
.
Viz také
- Anonymní rekurze - Rekurze bez volání funkce podle jména
- Dědičnost (objektově orientované programování) - Mechanismus zakládání objektu nebo třídy na jiném objektu nebo třídě zachovávající podobnou implementaci
- Vlastní reference - Věta, myšlenka nebo vzorec, který odkazuje na sebe
- Schizofrenie (objektově orientované programování) - Komplikace vyplývající z delegování a souvisejících technik v objektově orientovaném programování
- Předpona segmentu programu - datová struktura v systému DOS
Reference
- ^ Dahl, Ole-Johan; Myhrhaug, Bjørn; Nygaard, Kristen (1970). „Common Base Language, Norwegian Computing Center“.
- ^ Powell, Thomas A a Schneider, Fritz, 2012. JavaScript: The Complete Reference, Third Edition. McGraw-Hill. Kapitola 11, Zpracování událostí, str. 428. ISBN 978-0-07-174120-0
- ^ Používání GNU Compiler Collection (GCC) - Vázané členské funkce
- ^ "Uzavřená a otevřená rekurze ", Ralf Hinze, Červenec 2007
- ^ Otevřená rekurze, Lambda the Ultimate
- ^ "Selektivní otevřená rekurze: Řešení problému křehké základní třídy ", Jonathan Aldrich
- ^ "Selektivní otevřená rekurze: Řešení problému křehké základní třídy ", Lambda the Ultimate
- ^ Aldrich, Jonathan a Kevin Donnelly. "Selektivní otevřená rekurze: Modulární uvažování o komponentách a dědičnosti. „SAVCBS 2004 Specification and Verification of Component-Based Systems (2004): 26. citující pro JDK přijaté řešení C. Ruby a GT Leavens.„ Bezpečné vytváření správných podtříd bez nutnosti vidět kód nadtřídy “. V objektově orientovaných programovacích systémech, jazyky a Applications, říjen 2000. doi:10.1145/353171.353186 k dispozici také jako technická zpráva TR # 00-05d
- ^ ISO / IEC 14882: 2003 (E): Programming Languages - C ++. ISO / IEC. 2003.
- ^ Stroustrup: C ++ styl a technika - časté dotazy
- ^ De Smet, Bart, 2011. C # 4.0 Unleashed. Sams Publishing, Indianapolis, USA. Kapitola 4, Jazykové základy, s. 210. ISBN 978-0-672-33079-7
- ^ POZNÁMKA: Čísla řádků jsou pouze pro referenční účely. Eiffel nemá v textu třídy čísla řádků. V Eiffel Studio IDE však existuje možnost čísla řádku, kterou lze volitelně zapnout pro referenční účely (např. Programování párů atd.).
- ^ Barnes, D. a Kölling, M. Objekty nejprve s Javou. „... důvodem pro použití tohoto konstruktu [tohoto] je to, že máme situaci, která je známá jako přetížení názvu - stejný název používaný pro dvě různé entity ... Je důležité si uvědomit, že pole a parametry jsou samostatné proměnné, které existují nezávisle na sobě, i když sdílejí podobné názvy. Parametr a pole sdílející jméno není v Javě opravdu problém. “[Citace je zapotřebí ]
- ^ Crockford, Douglas, 2008. JavaScript: Dobré části. O'Reilly Media Inc. a Yahoo! Inc. Kapitola 4, Funkce, s. 28. ISBN 978-0-596-51774-8
- ^ Powell, Thomas A a Schneider, Fritz, 2012. JavaScript: The Complete Reference, Third Edition. McGraw-Hill. Kapitola 5, Funkce, s. 170–1. ISBN 978-0-07-174120-0
- ^ Goodman, Danny, s Morrisonem, Michaelem, 2004. JavaScript Bible, 5. vydání. Wiley Publishing, Inc., Indianapolis, USA. Kapitola 33, Funkce a vlastní objekty, str. 987. ISBN 0-7645-5743-2
- ^ https://www.lua.org/pil/16.html
- ^ msdn. „PowerShell: About Automatic Variables“. docs.microsoft.com. Citováno 2018-03-22.
- ^ msdn. „about_Classes“. docs.microsoft.com. Citováno 2018-12-17.
- ^ Sjednocení typů a tříd v Pythonu 2.2, Guido van Rossum, “Přepsat metodu __new__ "
Další čtení
- Meyers, Scott, 1995. Efektivnější C ++: 35 nových způsobů, jak vylepšit vaše programy a návrhy. ISBN 0-201-63371-X Scott Meyers
- Stroustrup, Bjarne, 1994. Návrh a vývoj C ++. Addison-Wesley Pub. Co. ISBN 0-201-54330-3 Bjarne Stroustrup