Ruby обычно выполняет выражения при их разборе.Причина, по которой ваш код не работал должным образом, заключается в том, что вы устанавливаете переменную экземпляра класса для синглтон-класса класса Foo, но с другой стороны, вы обращаетесь к переменной экземпляра класса самого Foo, поэтомуэто не работает:
class << self
@val = "foo" # scope is class scope of singleton class of Foo
attr_reader :val
def set(val)
# scope is instance scope of singleton class of Foo (equal to Foo itself)
@val = val
end
end
Вот почему Foo.val
дает nil
в вашем случае - оно еще не было установлено.
Установка val
на оценку класса можетбыть достигнутым так, как Виктор уже продемонстрировал.
См. также в этом посте для обсуждения возможностей.