2017-03-15 9 views
1

私は、この奇妙な動作をダブルスプラットを使ってハッシュ変数を拡張しようとしました。なぜこれが起こっているのか分かりません。なぜこれが起こっているRubyでダブルスプラットで変数の空のハッシュを拡大する

マイルビーバージョン

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

Ops、忘れました!今更新中... – rafaels88

答えて

1

はい、それは非常に

def foo(*args) 
    args 
end 

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

h = {} 

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

バグのように見えるそれは、変数の二重のスプラットの場合の第1引数として空のハッシュを渡します。

マイバージョンはruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin16]

+0

私の質問が更新されました。私はメソッドの実装を置くことを忘れた。 'foo'でパラメータを受け取らずに、もう一度やり直せますか? – rafaels88

+1

あなたのメソッドにパラメータがないことが分かりました。私の答えでは、 'ArgumentError Exception'を受け取った理由を示しました。変数のdouble splatは空のハッシュをメソッドの第1引数として渡すためです。 @ rafaels88 – MikDiet

+0

はい、あなたは正しいです...私はあなたの考え方に従って、 'foo(** {a:1})'と 'h = {a:1} 'を渡すとすぐにいくつかのテストを行いました。 foo(** h) 'の場合、ビヘイビアは空のハッシュを渡すのとは違っています。それはバグのようです。診断をいただきありがとうございます! – rafaels88

関連する問題