То, что вы делаете, довольно часто встречается в Ruby, но также настолько распространено, что вам не нужно сильно суетиться по этому поводу.Все переменные экземпляра типа @
являются локальными только для этого экземпляра.Имейте в виду, что «экземпляр» обычно относится к экземпляру класса, но он также может ссылаться на экземпляр из класса.
Вы можете использовать @@
для ссылки наПеременная экземпляра класса из контекста экземпляра, но на практике это может привести к путанице.
То, что вы хотите сделать, - это одно из следующего.но только в контексте одного экземпляра объекта:
def func(x)
# Instance variables are always "defined" in the sense that
# they evaluate as nil by default. You won't get an error
# for referencing one without declaring it first like you do
# with regular variables.
@hash ||= { }
if @hash[x]
puts 'spaghetti'
else
@hash[x] = true
puts x.to_s
end
end
Переменная, которая сохраняется между вызовами методов, но только в контексте всех экземпляров объекта:
def func(x)
# Instance variables are always "defined" in the sense that
# they evaluate as nil by default. You won't get an error
# for referencing one without declaring it first like you do
# with regular variables.
@@hash ||= { }
if @@hash[x]
puts 'spaghetti'
else
@@hash[x] = true
puts x.to_s
end
end
Обычно это делается чище, оборачивая @@hash
в метод класса.Это имеет вторичный эффект облегчения тестирования:
def self.func_hash
@func_hash ||= { }
end
def func(x)
if self.class.func_hash[x]
puts 'spaghetti'
else
self.class.func_hash[x] = true
puts x.to_s
end
end