2014-01-07 4 views
0

Я, глядя на чьих-кодов и интересно о разнице между:или равный против равного

def blah 
    @hello ||= [1,2,3].collect{|x| x+1} 
end 

и

def blah 
    @hello = [1,2,3].collect{|x| x+1} 
end 

Я понимаю, что ||= средства «или равно», но почему мы нужно это? Пример был бы замечательным.

Кроме того, для метода collect, скажем, у меня есть массив:

a = [1,2,4,5] 

, и я хотел, чтобы найти массив, содержащий целые числа, которые больше, чем 2, как я могу использовать collect с этим?

a.collect{|x| x>2} # => [false, false, true, true] 

Я хочу [4,5].

+1

Если у вас есть два вопроса, пожалуйста, задать два вопроса. –

ответ

1

||= не делает ничего, если переменные были назначены значение (кроме false или nil):

irb(main):001:0> blah ||= 'foo' 
=> "foo" 
irb(main):002:0> blah ||= 'bar' 
=> "foo" 
irb(main):003:0> puts blah 
foo 
=> nil 
irb(main):004:0> blah = nil 
=> nil 
irb(main):005:0> blah ||= 'bar' 
=> "bar" 
irb(main):006:0> puts blah 
bar 
=> nil 

Одно из возможных применений является назначение переменных в отказоустойчивой образом. Сравните:

@data = get_data_from_some_source 
@data ||= get_data_from_fallback_source 
@data ||= get_data_from_last_resort_source 

с:

@data = get_data_from_some_souce 
if @data == nil 
    @data = get_data_from_fallback_source 
end 
if @data == nil 
    @data = get_data_from_last_resort_source 
end 

или даже (святые сохрани):

begin 
    @data = get_data_from_some_source 
rescue GettingDataDidntWorkException 
    begin 
    @data = get_data_from_fallback_source 
    rescue GettingDataDidntWorkException 
    @data = get_data_from_last_resort_source 
    end 
end 

Haskell программисты признают это похоже на использование в Maybe монады.

1

а = [1,2,4,5], и я хотел, чтобы найти массив, содержащий целые числа, которые больше, чем 2,

Здесь мы идем, используя Array#select:

a.select{|e| e > 2 } # => [4,5] 

Объяснения части @hello ||= [1,2,3].collect{|x| x+1} можно найти What does ||= (or equals) mean in Ruby?

+0

Это путь записи. – unknownbits

0

На странице What does ||= (or-equals) mean in Ruby? не упоминается «шаблон прокси-шаблона», который он в двух словах.

При первом вызове этой строки оценивается материал .select. Во второй раз система повторно использует значение @hello, не переустанавливая его. Из-за «булевого короткого замыкания» вещи справа от || не оцениваются, если левая сторона не false или nil.

(Кроме того, если вы никогда не оценивали @hello, Ruby автоматически создает его и назначает ему nil. Таким образом, Ruby позволяет прокси-серверу в одной строке, в качестве оптимизации.)

0

Хорошо, так что || = означает, что у вас уже есть предыдущее значение для вашей переменной, оно будет содержать else, если оно не имеет заранее заданного значения, тогда оно примет любое значение, которое вы его установили равно.

EX:

@hello = [1] 

def blah 
    @hello ||=[1,2,3] 
end 

blah 

@hello => [1], not [1,2,3] 
Смежные вопросы