@:n käyttäytyminen

@:n käyttäytyminen

> LeekScript-opetusohjelma

Tämä sivu on voimassa vain LS1:lle, LS2:ssa ja muissa versioissa sinun ei pitäisi enää käyttää @

Leekscriptissä, jos et ole vielä huomannut, on toimintojen raja per vuoro, joka on 20 miljoonaa. Optimointi on siis avain voittoon. Tässä artikkelissa käsitellään perusteellisesti @-merkin käyttäytymistä. @-merkki on erittäin suosittu työkalu.

Sen pääasiallinen käyttö on lähellä viittauksia, eli arvokopioita vältetään.

Tiivistetty selitys

Seuraava selitys antaa intuition at-merkin takana olevasta mekanismista. Se ei ole tarkka tekninen kuvaus, koska tällä hetkellä käytetyn LeekScript-version lähteitä ei ole saatavilla.

0; ""; []; function(x) { palauttaa x; };

Tehtävä

Kun luot objektin suoraan käyttämällä literaalia (katso edellä), se vie tilaa muistista. Jotta voit käyttää sitä, sinun on tiedettävä, mistä se löytää. Kutsumme tätä sijaintia kohteen osoitteeksi. Kun määrität objektin muuttujalle, siitä tehdään kopio, jonka jälkeen muuttujalle annetaan osoite. Kopion osoitteen ilmoittamisen sijaan voimme pyytää alkuperäisen kohteen osoitteen käyttöä kopioimisen välttämiseksi lisäämällä oikeanpuoleisen lausekkeen eteen yhtäläisyysmerkki a at. (left_hand=@right_hand)

var w = 0; // 0:sta tehdään kopio ja tämän kopion osoite annetaan. var x =@ 0; // Osoite 0 on annettu. (Jokainen koodin literaali on eri objekti.) olkoon y = w; // Kopio 0:sta tehdään kopio ja tämän kopion osoite ilmoitetaan. var z =@w; // 0:n kopion osoite on annettu.

At-merkkiä käytetään korkeimmalla tärkeydellä. Joten x=@y+z ei tee sitä, mitä olisit voinut kuvitella. Vastaava lauseke on "x = (@x) + y". Jos haluat määrittää osoitteen, sinun on lisättävä sulkumerkit määrittääksesi, mitä at-merkki koskee: x =@ (x + y).

Erikoistapaukset

--- Numeroiden operaatiot eivät mutatoi. Kun käytät operaattoreita, kuten +=, tuloksena on uusi objekti. Tämä eroaa taulukoista ja merkkijonoista, koska kaksi jälkimmäistä ovat rakenteita ja niiden sisältöä muutetaan. Jotta tämän toiminnan ymmärtäminen olisi hieman helpompaa, se auttaa laajentamaan ilmaisuja hieman. x += 1 muuttuu x = x + 1, huomaamme, että kyseessä on uudelleenmääritys. kun taas "x += [1]" muuttuu "x[count(x)] = 1" tai "push(x, 1)"/"pushAll(x, [1])"; on selvää, että muuttujaa "x" ei ole osoitettu uudelleen.

Asetus

Vastaavasti, kun välität objektin argumenttina funktiolle, siitä tehdään kopio ja tämän kopion osoite annetaan parametrille. Toisin kuin muuttujan määrittäminen, parametrin etuliitteen lisääminen at-merkillä käyttäytyy hieman monimutkaisemmin funktiota käytettäessä:

Siinä harvinaisessa tapauksessa, että haluat välittää kopion muuttujan osoitteen sijaan, voit liittää argumentin eteen at-merkin: "at(@zero)".

Parametrissa

Sen vakain ja käytännöllisin käyttö on funktion parametreissa:

funktio with_a (@ param1 ) { } // Joka kohtaamme: funktio whitout_a ( param1 ) { }

Huom: Jos muutat funktion parametria, tämä muutos tapahtuu myös kutsuvan ohjelman muuttujassa, koska annettu arvo on sinun muuttujasi, ei sen arvo, esim.

funktio add_1 (@param) { param += 1; }

olkoon a = 5; add_1(a); debug(a); // näyttää: '6'

Huomautus: Toiminnon kutsuminen maksaa 1 toiminnon. Tämä kustannus vähennettiin seuraavista tuloksista.

Raakatietojen läpikulku Muuttujan läpikulku Tiedot välitetään parametrina ilman @-merkkiä @-merkinnällä muuttujan kohdistamiskustannuksilla (vrt Tehtävä) ilman @-merkkiä ' @-merkillä 42 2 1 2 2 0 "merkkijono" 2 1 2 2 0 funktio () {} 2 1 2 2 0 [42, -42, 42] 116 34 116 83 0 ["