2016-09-01 63 views
1

Ruby告訴我一個參數正在傳遞(應該是0)。我期待** {}是等同的。我在想什麼錯誤?Ruby - splat和send()混淆

class Test 
    def takenothing() end 
end 

def wrapper(*args, **keys, &block) 
    keys.delete :key 
    Test.new.send :takenothing, *args, **keys, &block 
end 

wrapper key: 'nyeh' 

回答

3

好吧,讓我們來看看:

def wrapper(*args, **keys, &block) 
    keys.delete :key 
    p **keys 

OK:

$ ruby test.rb 
{} 

所以,不,打電話時**{}的方法呢不要從參數列表中刪除它, t只是計算一個空的散列。

看看StackOverflow上的其他question和相應的Ruby bug report

1

你所得到的錯誤的原因是因爲send方法調用takenothing方法與參數,但takenothing方法不帶任何參數。

Test.new.send :takenothing, *args, **keys, &block 
Test.new.send symbol  [, args...]) 

而且你的方法

def takenothing() end # this method takes no argument 
+0

這些不只是常規的參數。他們是splat和kwsplat。根據你的邏輯,該方法應該抱怨通過了2個參數。但它說「1通過」。怎麼會這樣? –

+0

'* args'是可選的,'** keys'允許將Hash轉換爲關鍵字參數。由於他只有一個參數,它將成爲鍵的一部分,並且參數將爲空。 Ruby不會抱怨可選參數。 – davidhu2000

+0

但他從密鑰中刪除唯一的密鑰。 –