Kiedy zmianna '_foo' została już powołana do życia, redeklaracja jej jako 'private' w tej samej przestrzeni wątku jest nieporozumieniem, bo '_' czyni z niej zmienną lokalną.
Sprawdź sobie coś takiego:
"testLocalA.sqs"
Kod: Zaznacz cały
_side = "A";
player sideChat _side;
@false;
exit;
"testLocalB.sqs"
Kod: Zaznacz cały
this exec "testLocalA.sqs"; this exec "testLocalB.sqs";
i co ? A wiesz dlaczego ?
Kiedy Arma wywołuje skrypt tworzy dla niego wątek i dynamicznie przydziela pamięć na zmienne. Zmienne globalne jak każde inne są trzymane w strukturze, według zasięgu (wątku):
Kod: Zaznacz cały
type variant = record
{
name :string;
type :byte; {"ARRAY", "BOOL", "CODE", "CONFIG", "CONTROL", "DISPLAY", "GROUP", "OBJECT", "SCALAR", "SCRIPT", "SIDE", "STRING", "TEXT"}
value :variant;
}
type This = array of variant;
kiedy deklarujesz zmianną trafia ona do tablicy zmiennnych według zasięgu:
Kod: Zaznacz cały
This = This + [[name = "foo"; type = "SCALAR"; value = 10]]
Arma tworzy zmienną w takiej tablicy wariantów (pole 'value' może przybrać postać np: tekstu, liczby rzeczywistej). Do której zmiennej 'This' zostanie dodana Twoja zmienna ? - decyduje jej deklaracja.
'zmienna' trafia do globalnej tablicy.
'private' dodaje zmienną do tablicy zmiennych na stosie wątku który TWORZY zmienną. Jeśli w ramach wątku tworzysz wątek (przez skrypt) mu potomny, to skrypt potomny ma dostęp do takiej zmiennej. Jeśli skrypty są wywoływane odzielnie to nie dzielą przestrzeni adresowej, ani nazwy zmiennej 'private'.
'_' wstawia zmienną do loklalnej tablicy wątku w którym go tworzy.
kiedy odwołujesz się do zmiennej (przez nazwę), Arma sprawdza czy w tablicy variantów zmienna o tej nazwie istnieje i zwraca pole 'value' lub 'Null'. 'private' pozwala na dostęp do zmiennej w ramach tzw. enkapsulacji przesztrzeni adresowej (hierarhiczna i polimorficzna tablica variantów), która przechodzi przez dziedziczenie do wątków potomnych, więc deklarując zmienną jako 'private' w wątku potomnym zamazujesz jej wartość w wątku który do wywołał (this exec).