2015-05-29 9 views
6

Может ли кто-нибудь поставить свет на это выражение. Кажется, что оба они одинаковы, но это не так.Разница между || a = b и a = a || b в рубине?

a || a = b or a ||= b 

и

a = a || b 

если

a = 4 и b = 6, выход всегда 4

Это всегда запутать и недоразумением меня. Может кто-нибудь объяснить это?

+1

может прочитать [эту статью] (http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html). 'a || a = b', 'a = a || b' и 'a || = b', все немного отличаются по своей природе. – Oka

ответ

10

ищет a если a является truthy, возвращает a, в противном случае a = b делается то присвоить значение b «s к a.

a = a || b 

Это операция присваивания. Здесь вы присваиваете значение a независимо от того, какое значение оно имеет. Таким образом, a равно a || b. Во второй части отчета вы ищете a. Если его значение является правдивым, вы назначаете его обратно на a, иначе вы назначаете b значение a.

TL; DR

a = a || b является присвоение значения (в зависимости от состояния) к a независимо от того, какое значение она имеет.

a ||= b возвращение a если уже есть, то еще делает a = b

Объясняя с примером:

Вы можете думать о a || a = b, как a || (a = b). Теперь давайте предположим, что a = 4 и b = 6.

Так как по порядку приоритета, это операция ИЛИ и поскольку порядок операций для или слева направо, мы начинаем с первым a:

# lets call this Fig. 1 
     a || (a = b) 
    ^
     | 
     . 
    (here) 

Это a имеет значение 4, который представляет собой truthy значения , Поэтому оценка останавливается тогда и там, и возвращается 4. (Почему Подсказка:true || anything = true)

Теперь предположим a = nil и b = 6. Мы снова начинаем с того же места (рис.1). Так как a - nil, что ложно в Ruby, мы перемещаемся вправо от операции ИЛИ, т.е.a = b

# lets call this Fig. 2 
     a || (a = b) 
      ^
       | 
       . 
      (here) 

Поскольку это операция присваивания, то будут выполнены, и мы в конечном итоге назначая 6 к a.

Возврат к a = a || b. Вы можете считать это a = (a || b). Очевидно, что по порядку приоритета - операция присвоения. Так как порядок операций для присваивания справа налево, сначала оценивается (a || b).

# lets call this Fig. 3 
     a = (a || b) 
      ^
      | 
      . 
      (here) 

Если a = 4 и b = 6, a || b будет возвращать 4(как обсуждалось выше). Иначе, если a = nil и b = 6, a || b вернется 6.

Теперь любое значение возвращается из этого || операция получает присвоенную первой a.

# lets call this Fig. 4 
     a = (a || b) 
    ^
     | 
     . 
    (here) 
+0

Спасибо за ваш ответ, вы можете объяснить на примере, который может помочь нам лучше понять его. –

+0

@ChitrankSamaiya Я попытался объяснить свой ответ примерами в моей последней редакции. Пожалуйста, проверьте. – shivam

+0

Отличные ответы +1 –

4

Обычного заблуждение является то, что:

a ||= b эквивалентно a = a || b, но он ведет себя как a || a = b

В a = a || b, устанавливаются на что-то в заявлении на каждый счете, в то время как с a || a = b, a устанавливается только в том случае, если a логически ложно (т.е. если оно равно нулю или false), потому что || - «короткое замыкание».

Позвольте мне держать эту простой:

То есть, если левая сторона рука || сравнение действительно, есть не нужно проверять правую сторону.

более ссылка RubyInside

Смежные вопросы