在 Ruby 中使用双 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.

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

是的,它看起来像一个错误

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

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

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

相关内容

  • 没有找到相关文章

最新更新