2014-01-07 119 views
0

我找了別人的代碼,並想知道的區別:或等於VS等於

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

||=沒有如果變量已分配一個什麼值(比falsenil等):

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 

哈斯克爾程序員會認識到這一點沿用到Maybe單子相似。

0

頁面What does ||= (or-equals) mean in Ruby?沒有提及「代理設計模式」,簡而言之,

您第一次調用該行時,會對.select內容進行評估。第二次,系統重新使用@hello值,而不重新分配它。由於「布爾短路」,||右側的內容不會評估,如果左側不是falsenil。 (另外,如果您以前從未評估過@hello,Ruby會自動創建一個,並將nil賦值給它,因此Ruby可以讓您在一行中進行代理優化。)

0

好了,所以|| =意味着,如果你已經有一個變量前值將保持 否則,如果它不具有任何預先指定的值,那麼它會採取任何價值,你把它等於。

EX:

@hello = [1] 

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

blah 

@hello => [1], not [1,2,3]