2017-02-24 40 views
1

以下两行之间有什么区别?|||除非包含?各色?

# settings and globals are Hash 
@settings[:xvfb] = globals[:xvfb] unless settings.include?(:xvfb) 
@settings[:xvfb] ||= globals[:xvfb] 

它们是否相等?

+2

取决于“设置”是什么。 – sawa

+0

'settings'和'globals'是'Hash'。问题已更新。 –

+1

@AlexandreArdhuin:除了塞尔吉奥所说的:你有一个错字。我想你的意思是'除非@ settings.include?(:xvfb)'。 – user1934428

回答

6

不,它们不是等价的。它们在处理错误的值方面有所不同。

globals = { foo: 'bar' } 

h = { foo: nil } 
h.include?(:foo) # => true 
h[:foo] = globals[:foo] unless h.include?(:foo) 
h # => {:foo=>nil} 

h = { foo: nil } 
h[:foo] ||= globals[:foo] 
h # => {:foo=>"bar"} 
+1

另外值得注意的是,这种差异很常见,并且是不相关的。这完全取决于您正在处理的数据类型。如果你可以确定它不是'nil'或'false',那么'|| ='可以毫不费力地完成这项工作。 – tadman

+0

@tadman:对。但是当它用于缓存时,如果'expensive_method'返回说,一个巨大的数组或'nil',那么它确实会产生巨大的差异。 –

+0

@EricDuminil绝对。这就是为什么要意识到你处理的价值是至关重要的。如果您可以设计该方法来返回一个空数组或散列而不是'nil',那么这可能有助于更好地接口。 – tadman