Jest to związane z dziwactwem zasad klasyfikacji Rubiego.
W ruby, nieodkryta zmienna x
pojawiająca się sama może być zmienną lokalną lub wywołaniem metody - gramatyka nie może powiedzieć, która. Od parsera zależy to, czy rozwiązuje lokalne odwołania do zmiennych. Zasada jest prosta: jeśli przypisanie do zmiennej o tej samej nazwie było już widziane w zasięgu lokalnym, to referencja jest zmienną lokalną, a odniesienie jest powiązane z tą zmienną lokalną. W przeciwnym razie jest to wywołanie metody, które zostanie sprawdzone jako takie w czasie wykonywania.
Lokalne referencje zmiennych w języku Ruby są optymalizowane do wyszukiwania tablic (każdej zmiennej lokalnej przypisuje się "gniazdo", a powiązane odwołania do zmiennych lokalnych generowane przez analizator składni są konwertowane na odniesienia do szczelin). Tablica jest inicjowana ze wszystkimi nil
:
/* initialize local variables */
for (i=0; i < local_size; i++) {
*sp++ = Qnil;
}
Tak więc, jeśli odwołać się do zmiennej lokalnej, który nie został przypisany przez oprawionego lokalnego odniesienia (co może się zdarzyć, jeśli tylko nie było pomijane przypisanie powyżej odniesienia w tym samym zasięgu lokalnym), otrzymujesz nil
.
Ah, pobili mnie do tego. Ładne wyjaśnienie. – nneonneo