В Ruby модули и классы являются объектами, поэтому для них можно установить переменные экземпляра.
module Test
@test = 'red'
def self.print_test
puts @test
end
end
Test.print_test #=> red
Ваша ошибка в том, что переменная @color одинакова для:
module SharedVar
@color
end
и
module SharedVar
def show_color
@color
end
end
что не так.
В первом примере переменная экземпляра принадлежит объекту SharedVar
, а во втором примере переменная экземпляра принадлежит объекту, в который вы включаете модуль.
Другое объяснение self указатель. В первом примере указатель self устанавливается на объект модуля SharedVar
, поэтому ввод @color
будет ссылаться на объект SharedVar
, и нет связи с другим объектом. Во втором примере метод show_color
может быть вызван только для некоторого объекта, т.е. ex1.show_color
, поэтому указатель self будет указывать на объект ex1
. Так что в этом случае переменная экземпляра будет ссылаться на ex1
объект.