2013-05-14 33 views
0

方法的第一個版本:這兩個Ruby方法的哈希參數是否相等?如果不是,爲什麼不呢?

def method(param1, param2={}) 
    meth_x(param2).meth_y(param1) 
    meth_z 
    #... 
end 

方法(注意第二個參數2)的第二個版本......

def method(param1, param2={}) 
    meth_x(param2={}).meth_y(param1) 
    meth_z 
    #... 
end 

我會假設,這兩種方法是等效的,因此我會與第一個一起去(少打字,減少冗餘)。

但是,我很好奇,如果這些預計會表現不同,如果是這樣,爲什麼。

+0

你有什麼理由認爲他們的行爲可能不同嗎? – 2013-05-14 14:17:28

+0

我從我的團隊中的其他開發者那裏得到了關於行爲差異的模糊聲明 - 儘管此刻我對他們持懷疑態度。 :-) – 2013-05-14 14:21:13

回答

3

在第二步中,您將param2設置爲空散列,然後將其作爲參數提供給meth_x。在方法定義param2 = {}意味着如果參數被省略,那麼它被設置爲這個默認的空散列,但在meth_x(param2 = {})意味着你刪除param2的原始內容並將其替換爲空散列,然後將它給予meth_x

irb(main):001:0> a = {:alma => 2} 
=> {:alma=>2} 
irb(main):002:0> puts a 
{:alma=>2} 
=> nil 
irb(main):003:0> puts(a) 
{:alma=>2} 
=> nil 
irb(main):004:0> puts(a = {}) 
{} 
=> nil 
+1

所以在第二個例子中,param2將*總是*爲空散列? – 2013-05-14 14:24:57

+0

我的意思是,*有效*它將始終是一個空的散列,而不管傳遞給#method的是什麼? – 2013-05-14 14:33:03

+0

葉普,多數民衆贊成的方式。更好的是,對於'method'的其餘部分,'param2'將包含這個新值。如果你的意思是把它初始化爲一個空的散列,以防它爲'nil',那麼使用'meth_x(param2 || = {})或'meth_x(param2 || {})'。這樣原始內容不會丟失。但是由於您在方法定義中使用了默認參數值,因此不能如此。 – Matzi 2013-05-14 14:33:19

相關問題