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'
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'
好吧,讓我們來看看:
def wrapper(*args, **keys, &block)
keys.delete :key
p **keys
OK:
$ ruby test.rb
{}
所以,不,打電話時**{}
的方法呢不要從參數列表中刪除它, t只是計算一個空的散列。
看看StackOverflow上的其他question和相應的Ruby bug report。
你所得到的錯誤的原因是因爲send
方法調用takenothing
方法與參數,但takenothing
方法不帶任何參數。
Test.new.send :takenothing, *args, **keys, &block
Test.new.send symbol [, args...])
而且你的方法
def takenothing() end # this method takes no argument
這些不只是常規的參數。他們是splat和kwsplat。根據你的邏輯,該方法應該抱怨通過了2個參數。但它說「1通過」。怎麼會這樣? –
'* args'是可選的,'** keys'允許將Hash轉換爲關鍵字參數。由於他只有一個參數,它將成爲鍵的一部分,並且參數將爲空。 Ruby不會抱怨可選參數。 – davidhu2000
但他從密鑰中刪除唯一的密鑰。 –