Zachowanie @

Zachowanie @

> LeekScript samouczek

Ta strona jest ważna tylko dla LS1, w LS2 i więcej nie powinieneś już używać @

W Leekscript, jeśli jeszcze nie zauważyłeś, istnieje limit operacji na turę, który wynosi 20 milionów. Optymalizacja jest więc kluczem do zwycięstwa. W tym artykule szczegółowo omówimy zachowanie znaku „@”, który jest bardzo popularnym narzędziem.

Jego główne zastosowanie jest zbliżone do odniesień, to znaczy unika się kopiowania wartości.

Skrócone wyjaśnienie

Poniższe wyjaśnienie służy wyczuciu mechanizmu stojącego za znakiem at. Nie stanowi dokładnego opisu technicznego, ponieważ źródła obecnie używanej wersji LeekScript nie są dostępne.

0; ""; []; funkcja(x) { zwróć x; };

Zadanie

Gdy tworzysz obiekt bezpośrednio przy użyciu literału (patrz wyżej), zajmuje on miejsce w pamięci. Aby móc z niego korzystać, trzeba wiedzieć, gdzie go znaleźć. Pozycję tę nazwiemy adresem obiektu. Kiedy przypisujesz obiekt do zmiennej, tworzona jest kopia tego obiektu, a następnie adres jest dostarczany do zmiennej. Zamiast podawać adres kopii, możemy poprosić o użycie adresu oryginalnego obiektu, aby uniknąć kopiowania, poprzedzając wyrażenie po prawej stronie znakiem równości at. (lewa_ręka=@prawa_ręka)

zmienna w = 0; // Tworzona jest kopia 0 i podany jest adres tej kopii. var x =@ 0; // Podano adres 0. (Każdy literał w kodzie jest innym obiektem). niech y = w; // Tworzona jest kopia kopii 0 i podany jest adres tej kopii. var z =@w; // Podano adres kopii 0.

Znak at jest stosowany z najwyższym priorytetem. Więc x=@y+z nie zrobi tego, co mogłeś sobie wyobrazić. Równoważne wyrażenie to x = (@x) + y. Jeśli chcesz przypisać adres, musisz dodać nawiasy, aby określić, do czego odnosi się znak at: x =@ (x + y).

Przypadki specjalne

--- Operacje na liczbach nie mutują. Kiedy używasz operatorów takich jak +=, rezultatem jest nowy obiekt. Różni się to od tablic i ciągów znaków, ponieważ te dwa ostatnie są strukturami i to ich zawartość jest modyfikowana. Aby nieco ułatwić zrozumienie, jak to działa, warto nieco rozszerzyć wyrażenia. x += 1 staje się x = x + 1, zauważamy, że następuje ponowne przypisanie. Natomiast x += [1] staje się x[liczba(x)] = 1 lub push(x, 1)/pushAll(x, [1]); jasne jest, że zmienna x nie jest ponownie przypisywana.

Ustawienie

Podobnie, kiedy przekazujesz obiekt jako argument funkcji, tworzona jest kopia, a adres tej kopii jest przekazywany do parametru. Jednak w przeciwieństwie do przypisywania do zmiennej, poprzedzanie parametru znakiem at ma nieco bardziej złożone zachowanie podczas stosowania funkcji:

W rzadkich przypadkach, gdy chcesz przekazać kopię zamiast adresu zmiennej, możesz poprzedzić argument znakiem at: at(@zero).

W parametrze

Najbardziej stabilne i praktyczne zastosowanie znajduje się w parametrach funkcji:

funkcja z_a (@ param1 ) { } // Z którym się skonfrontujemy: funkcja bez_a ( param1 ) { }

Uwaga: Jeśli zmodyfikujesz parametr w funkcji, modyfikacja ta nastąpi również w zmiennej programu wywołującego, ponieważ podana wartość jest Twoją zmienną, a nie jej wartością, na przykład:

funkcja add_1 (@param) { parametr += 1; }

niech a = 5; add_1(a); debugowanie (a); // wyświetla: '6'

Uwaga: Wywołanie funkcji kosztuje 1 operację. Koszt ten został odjęty od następujących wyników.

Przekazywanie surowych danych Przekazywanie przez zmienną Dane przekazane jako parametr bez '@' z '@' koszt przypisania do zmiennej (por. Przypisanie) bez ' @ „ z „@” 42 2 1 2 2 0 "łańcuch znaków" 2 1 2 2 0 funkcja () {} 2 1 2 2 0 [42, -42, 42] 116 34 116 83 0 ["