По первому примеру.
method определен для потомков (экземпляры, инстансы) класса
Module,
Class наследуется от класса
Module поэтому в нем этот метод тоже есть.
NewClass является потомком класа
Class, т.е
NewClass.class == Classself - указатель на текущий объект, соответвенно область видимости текущий объект.
Так как
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) - ошибки не происходит, переменная класса определена.
По второму примеру, как и говорил ранее, переменная класса доступна как для методов класса, так и для методом потомков определенных в классе, и является одной и тойже переменной, поэту при изменении в одном месте, она меняется и в другом.
Объяснил как смог, вобщем :)
Поподробней можно почитат, например,
тут