2017-03-15 70 views
1

我得到了這種奇怪的行爲,試圖使用雙摔跤擴大哈希變量。不知道爲什麼會發生這種情況。在紅寶石中使用雙摔跤擴展變量中的空哈希

我的紅寶石版本

ruby 2.2.6p396 (2016-11-15 revision 56800)

方案

class MyClass 
    def my_method; end 
end 

MyClass.new.my_method(*[]) # returns nil 

MyClass.new.my_method(**{}) # returns nil 

MyClass.new.my_method(*[], **{}) # returns nil 


# Using variables 

values = [] 
k_values = {} 

MyClass.new.my_method(*values) # returns nil 

MyClass.new.my_method(**k_values) # *** ArgumentError Exception: Wrong number of arguments. Expected 0, got 1. 

MyClass.new.my_method(*values, **k_values) # *** ArgumentError Exception: Wrong number of arguments. Expected 0, got 1. 


# In summary 

MyClass.new.my_method(**{}) # returns nil 

MyClass.new.my_method(**k_values) # *** ArgumentError Exception: Wrong number of arguments. Expected 0, got 1. 

是否有任何人知道爲什麼會這樣?這是一個錯誤?

+3

'my_method'代碼? – MikDiet

+0

行動中,我忘了!正在更新... – rafaels88

回答

1

是的,這非常看起來像一個錯誤

def foo(*args) 
    args 
end 

foo(**{}) 
# => [] 

h = {} 

foo(**h) 
# => [{}] 

它通過空哈希作爲變量的雙圖示的情況下,第一個參數。

我的版本是ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin16]

+0

我更新了我的問題。我忘了執行該方法。你可以再試一次,但沒有收到'foo'中的任何參數? – rafaels88

+1

我知道你的方法沒有參數。在我的回答中,我向你展示了爲什麼你收到'ArgumentError Exception' - 因爲變量上的雙splat將空hash作爲第一個參數傳遞給方法。 @ rafaels88 – MikDiet

+0

是的,你是對的......我按照你的思路進行了一些測試,如果你通過了'foo(** {a:1})'然後'h = {a:1}; foo(** h)',這個行爲不同於你在例子中傳遞空的散列。這看起來像一個錯誤。非常感謝您的診斷! – rafaels88