2010-09-27 2 views

ответ

9

Он используется главным образом в качестве Shortform для инициализации переменной определенного значения, если он еще не установлен.

Подумайте о заявлении как возвращающемся x || (x = y). Если x имеет значение (кроме false), только левая сторона || будет evalutated (с ||коротких circuts) и x не будет переназначать. Однако, если x - false или nil, будет оценена правая сторона, которая установит x в y, а y будет возвращен (результат операции присваивания - это правая сторона).

См. http://dablog.rubypal.com/2008/3/25/a-short-circuit-edge-case для дальнейшего обсуждения.

+0

+1 забыл об этом –

+0

'x || = y' действует как' x = y, если x', который (если мы предположим, что x и y означают произвольные выражения, а не обязательно переменные), это * не * то же самое, что либо 'x = x || y' (рассмотрите случаи, когда 'x = x' не является no-op) или' x = y, если x.nil? '(рассмотрим случай, когда x является ложным). – sepp2k

+0

Jorg W Mittag считает, что это неверно в [его ответе] (http://stackoverflow.com/questions/995593/what-does-mean-in-ruby) на дублированный вопрос. –

3

Идея такая же, как и с другими подобными операторами (+=, *= и т.д.):
a ||= b является a = a || b

И этот трюк не ограничивается только Ruby: он проходит через множество языков с корнями C.

Редактировать чтобы отразить downvoters.
См. Один из ссылок Йорга для более точного приближения, например this one.
Именно поэтому я не люблю Ruby: ничто никогда не кажется таким, каким кажется.

+1

В частности, не C или C++ или Java. – SingleNegationElimination

+0

@TokenMacGuy Я имею в виду общий «трюк»: создание «a @ = b» из «a = a @ b». –

+0

Это неправильно. Пожалуйста, прочтите http://Ruby-Forum.Com/topic/151660 и ссылки, представленные в нем. –

4

x ||= y часто используется вместо x = y if x == nil

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