ПРЕДУПРЕЖДЕНИЕ Re: Общий шаблон Ruby
Это ключевой ответ: метод defined?
. Принятый ответ выше прекрасно это иллюстрирует.
Но под волнами скрывается акула ...
Рассмотрим этот тип общего шаблона рубина:
def method1
@x ||= method2
end
def method2
nil
end
method2
всегда возвращает nil
. При первом вызове method1
переменная @x
не устанавливается - поэтому будет запущен method2
.
и method2
установит @x
в nil
. Это хорошо, и все хорошо. Но что происходит во второй раз, когда вы звоните method1
?
Помните, @x уже был установлен в ноль. But method2
все равно снова будет запущен !! Если method2 является дорогостоящим мероприятием, возможно, это не то, что вам нужно.
Пусть на помощь придет метод defined?
- с этим решением этот конкретный случай обрабатывается - используйте следующее:
def method1
return @x if defined? @x
@x = method2
end
Дьявол кроется в деталях: но вы можете избежать этой скрывающейся акулы с помощью метода defined?
.