Подтвердить что ты не робот

Когда мы используем оператор "|| =" в Rails? Каково его значение?

Возможный дубликат:
Что означает оператор || = в ruby?

Я путаюсь с использованием оператора ||= в Rails. Я не мог найти ничего полезного в Интернете. Кто-нибудь может направить меня?

Сообщите мне, есть ли какие-либо веб-ссылки, о которых вы знаете.

Я хотел бы, что означает следующий оператор:

@_current_user ||= session[:current_user_id] &&
      User.find(session[:current_user_id])
4b9b3361

Ответ 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