Вот пример (подумайте ActiveRecord):
class Base
def connect(connection)
@@connection = connection
end
def connection
@@connection
end
end
class User < Base
end
class SuperUser < User
end
Base.new.connect("A connection")
puts User.new.connection #=> A connection
puts SuperUser.new.connection #=> A connection
Хитрость в том, что переменная класса доступна из метода экземпляра и наследуется. Попробуйте это:
class Base
def self.connect(connection)
@connection = connection
end
def self.connection
@connection
end
def connection
self.class.connection
end
end
class User < Base
end
Base.connect("A connection")
puts User.new.connection #=> nil
Вы получите nil
, когда self.connection
попытается получить доступ к своей собственной переменной экземпляра класса (из User
class), и она не наследуется.
Добавлено: И да, это может быть опасно, если вы злоупотребите им:
@@a = "A"
class A
def self.a
@@a
end
def a
@@a
end
end
puts A.a #=> A
puts A.new.a #=> A