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

Оператор '|| =' в Ruby

Может ли кто-нибудь объяснить мне смысл следующего кода Ruby? (Я видел этот фрагмент кода в проекте одного парня):

car ||= (method_1 || method_2 || method_3 || method_4)

В чем разница между приведенным выше кодом и следующим кодом?

car = method_1 || method_2 || method_3 || method_4

---------- обновление --------------

Хорошо, я получил значение оператора ||= после чтения @Dave, мой следующий вопрос, если оба method_2, method_3 и method_4 возвращают значение, которое значение будет присвоено car? (Я полагаю, что car является nil)

4b9b3361

Ответ 1

Это оператор присваивания для "условного присваивания"

Смотрите здесь → http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Operators

Условное присвоение:

 x = find_something() #=>nil
 x ||= "default"      #=>"default" : value of x will be replaced with "default", but only if x is nil or false
 x ||= "other"        #=>"default" : value of x is not replaced if it already is other than nil or false

Оператор || = является сокращенной формой выражения:

x = x || "default" 

EDIT:

После просмотра OP-редактирования пример является просто расширением этого, что означает:

car = method_1 || method_2 || method_3 || method_4

Будет присваивать первое не-нильское или не ложное возвращаемое значение method_1, method_2, method_3, method_4 (в этом порядке) до car или оно сохранит старое значение.

Ответ 2

car ||= (method_1 || method_2) 

эквивалентно

car = (car || (method_1 || method_2)) 

В общем случае

x op= y 

означает

x = x op y

Ответ 3

оператор ||= проверяет сначала, если ваше значение car уже установлено. Если car возвращает nil, он назначит первое значение с правой стороны, которое не вернет nil или false.

Итак, учитывая ваш пример сверху, если вы присвоите значение автомобилю, например

car = "BMW"

и вы выполните код-фрагмент, значение автомобиля будет по-прежнему "BMW";

Если метод_1 возвращает (например) строку "Value from Method 1" и автомобиль nil или false, тогда автомобиль этой строки будет назначен для автомобиля

car = nil
car ||= (method_1 || method_2)
car # => "Value from Method 1"

Если метод_1 также возвращает nil/false, он будет проверять значение в методе_2 и так далее, пока не получит какое-то истинное значение

Разница во втором фрагменте кода заключается в том, что в случае ||= сначала будет оценена переменная car и будет установлена, если она вернет nil или false.

Если вы используете только =, оценка не будет выполнена, и автомобиль будет установлен на первое значение справа, которое не вернет ниль или false.

- ОБНОВЛЕНИЕ -

Чтобы ответить на вопрос о обновлении, значение с правой стороны будет оцениваться слева направо, поэтому будет назначен первый, который не возвращает nil или false.

car = nil
# method_1 => "nil"
# method_2 => "false"
# method_3 => "value method 3"
# method_4 => "I won't be called"

car ||= (method_1 || method_2 || method_3 || method_4)
# => "value method 3"

Ответ 4

car ||= (method_1 || method_2 || method_3 || method_4)  

автомобиль сохранит свое значение после выполнения этого утверждения, если автомобиль первоначально не равен нулю.

Если автомобиль был равен нулю перед этим утверждением, первое значение, отличное от nil для возврата из метода_1, method_2,..., будет присвоено автомобилю.


car = method_1 || method_2 || method_3 || method_4

В этом случае автомобиль будет переназначен первым значением, отличным от нуля, для возврата из методов, даже если автомобиль уже имеет значение, отличное от нуля, до того, как этот оператор запустил

Ответ 5

car || = (метод_1 || метод_2)

равно

автомобиль = автомобиль || (метод_1 || метод_2)

Ответ 6

короче он равен:

car = car || method_1 || method_2

более подробно, это немного сложнее:

car = (defined?(car) && car) || (method_1 || method_2)

в любом случае, что произойдет после того, как ||= будет выполняться только, если car:

  • еще не определено
  • false
  • nil

Ответ 7

ответ на обновление:

method_2 присваивается, так как он является первым не-ложным, отличным от нуля значением в списке.