2016-09-01 6 views
1

Rubyは1つの引数が渡されていることを伝えています(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

これは単なる正規表現ではありません。彼らはスプラットとkwsplatです。あなたのロジックによって、このメソッドは約2つの引数を渡すと文句を言うべきです。しかし、それは "1合格"と言います。どうして? –

+0

'* args'はオプションで、' ** keys'はハッシュをキーワード引数に変換します。彼は1つの引数しか持っていないので、それはキーの一部であり、argsは空になります。 Rubyはオプションの引数については不平を言うことはありません。 – davidhu2000

+0

しかし、彼はキーから唯一のキーを削除します。 –