我正在查看某人的代码,并想知道之间的区别:
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]
。
答案 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]