Когда мы используем оператор "|| =" в Rails? Каково его значение?
Возможный дубликат:
Что означает оператор || = в ruby?
Я путаюсь с использованием оператора ||=
в Rails. Я не мог найти ничего полезного в Интернете. Кто-нибудь может направить меня?
Сообщите мне, есть ли какие-либо веб-ссылки, о которых вы знаете.
Я хотел бы, что означает следующий оператор:
@_current_user ||= session[:current_user_id] &&
User.find(session[:current_user_id])
Ответы
Ответ 1
Давайте сломаем его:
@_current_user ||= {SOMETHING}
Это говорит, установите @_current_user
в {SOMETHING}
, если это nil
, false
или undefined. В противном случае установите его на @_current_user
или, другими словами, ничего не сделайте. Расширенная форма:
@_current_user || @_current_user = {SOMETHING}
Хорошо, теперь на правой стороне.
session[:current_user_id] &&
User.find(session[:current_user_id])
Обычно вы видите &&
с булевыми значениями, однако в Ruby вам не нужно этого делать. Трюк здесь состоит в том, что если session[:current_user_id]
не равно nil, а User.find(session[:current_user_id])
не равно nil, выражение будет оцениваться как User.find(session[:current_user_id])
иначе nil.
Итак, соединяя все это в псевдокоде:
if defined? @_current_user && @_current_user
@_current_user = @_current_user
else
if session[:current_user_id] && User.find(session[:current_user_id])
@_current_user = User.find(session[:current_user_id])
else
@_current_user = nil
end
end
Ответ 2
Это шаблон кода "Ruby".
a ||= b
совпадает с
a = a || b
И что он делает, это инициализировать a до b, если a равно nil. Это важно, если мы будем использовать значение a. Скажем, нам нужна операция типа a += " and more text"
. Это будет умирать, если a равно нулю, поэтому мы можем сначала использовать a ||= ""
.
Ответ 3
Это возможности кэширования.
a ||= 1 # a assign to 1
a ||= 50 # a is already assigned, a will not be assigned again
puts a
#=> 1
это полезно, когда u загружает текущего пользователя из БД, если он загружен ранее, оператор не будет пытаться оценить правую часть уравнения, которая DRY, поэтому u может считать ее оператором кеширования.
REF:
http://railscasts.com/episodes/1-caching-with-instance-variables
Ответ 4
Если у вас есть опыт работы с С#, я считаю, что он похож (но больше на трюк Ruby) на нуль-коалесцирующий (??) оператор в С#
int? y = x ?? -1
x присваивается y, если x не является нулевым, в противном случае используется значение по умолчанию -1.
Аналогично, || = называется оператором T-квадрата, который, как я полагаю.
a || = b
или
a || a = b
Следуя вашему заявлению
@_current_user ||= session[:current_user_id] &&
User.find(session[:current_user_id])
В принципе, он видит, что @_current_user равен нулю или нет. Если он имеет какое-то значение, оставьте его в покое (текущий пользователь.) Else, выведите текущего пользователя из сеанса, используя идентификатор пользователя. Сначала он видит, находится ли идентификатор в сеансе, а затем получает от пользователя.
Посмотрите на блог ниже для получения дополнительной информации об операторе "T-square":
http://blogs.oracle.com/prashant/entry/the_ruby_t_square_operator