2014-01-07 118 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]