• Почему интерпретатор ruby ведет себя так неадекватно?

    Vakiliy
    @Vakiliy
    По первому примеру. method определен для потомков (экземпляры, инстансы) класса Module, Class наследуется от класса Module поэтому в нем этот метод тоже есть.

    NewClass является потомком класа Class, т.е NewClass.class == Class
    self - указатель на текущий объект, соответвенно область видимости текущий объект.

    Так как method является методом потомков, то и область видимости self в будет являться область видимости потомков.

    Теперь, переменная класса @@var определяется в Module, по наследованию доступна в Class, и будет доступна в методах как самого класса, так и в метододах для потомков, соответвенно доступна в method. (Можно устроть обменник для потоков, если поместить в мутекс, или сделать счетчик скока потомков порадилось, ну это так, для примера).

    Что происходит при вызове NewClass.method - self указываеть на NewClass, соответвенно self.class_variable_get(:@@var) пытается получить доступ к переменной класса опреленной в NewClass но так как ее там нет, получаем ошибку номер 1.

    p self.class.class_variable_get(:@@var) - self.class устанавливает область видимости Class (self указывает на NewClass) - ошибки не происходит, переменная класса определена.

    По второму примеру, как и говорил ранее, переменная класса доступна как для методов класса, так и для методом потомков определенных в классе, и является одной и тойже переменной, поэту при изменении в одном месте, она меняется и в другом.

    Объяснил как смог, вобщем :)

    Поподробней можно почитат, например, тут
    Ответ написан
    2 комментария