В рубине есть идиома: x ||= y
.
def something
@something ||= calculate_something
end
private
def calculate_something
# some long process
end
Но есть проблема с этой идиомой, если ваша «долго работающая утилита» может возвращать ложное значение (false или nil), так как оператор ||=
все равно вызовет оценку правой стороны.
Если вы ожидаете ложные значения, тогда используйте дополнительную переменную, способом, аналогичным предложенному DigitalRoss:
def something
return @something if @something_calculated
@something = calculate_something
@something_calculated = true
return @something
end
Не пытайтесь сохранить строку кода, сначала установив переменную @something_calculated, а затем запустив Calculate_something. Если ваша функция вычисления вызывает исключение, ваша функция всегда будет возвращать ноль и никогда больше не будет вызывать функцию вычисления.
В более общем смысле в Ruby вы используете переменные экземпляра. Обратите внимание, что они видны во всех методах данного объекта - они не являются локальными для метода.
Если вам нужна переменная, совместно используемая всеми экземплярами, определите метод в объекте класса, и в каждом экземпляре вызовите self.class.something
class User
def self.something
@something ||= calculate_something
end
def self.calculate_something
# ....
end
def something
self.class.something
end
end