或相等与平等

时间:2014-01-07 22:28:36

标签: ruby

我正在查看某人的代码,并想知道之间的区别:

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]

4 个答案:

答案 0 :(得分:1)

  

a = [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?

答案 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 monad的使用类似。

答案 2 :(得分:0)

页面What does ||= (or-equals) mean in Ruby?未提及“代理设计模式”,简而言之。

第一次调用该行时,会对.select内容进行评估。第二次,系统重新使用@hello值,而不重新分配它。由于“布尔短路”,如果左侧不是||false,则nil右侧的内容不会评估。

(另外,如果您之前从未评估过@hello,Ruby会自动创建一个,并为其分配nil。因此Ruby允许您在一行中进行代理,作为优化。)

答案 3 :(得分:0)

好的,所以|| =表示如果你已经拥有变量的先前值,它将保留它 否则,如果它没有任何预先指定的值,那么它将采用你设置的任何值等于。

EX:

@hello = [1]

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

blah 

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