在Ruby中用double splat扩展变量中的空哈希

时间:2017-03-15 16:30:58

标签: ruby splat double-splat

我有这种奇怪的行为试图使用双splat扩展哈希变量。不知道为什么会这样。

我的红宝石版

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.

有人知道为什么会这样吗?这是一个错误吗?

1 个答案:

答案 0 :(得分:1)

是的,它看起来像个错误

def foo(*args)
  args
end

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

h = {}

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

在变量的双重splat的情况下,它将空哈希作为第一个参数传递。

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