【问题标题】:Expanding empty hash in variable with double splat in Ruby在 Ruby 中使用双 splat 扩展变量中的空哈希
【发布时间】:2017-08-06 12:51:06
【问题描述】:

我在尝试使用 double 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.

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

【问题讨论】:

  • my_method 代码?
  • 算了,我忘了!正在更新中...

标签: ruby splat double-splat


【解决方案1】:

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

def foo(*args)
  args
end

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

h = {}

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

如果变量出现双重问题,它将空哈希作为第一个参数传递。

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

【讨论】:

  • 我更新了我的问题。我忘了把方法的实现。你能再试一次,但没有收到foo中的任何参数吗?
  • 我知道您的方法中没有参数。在我的回答中,我展示了您收到ArgumentError Exception 的原因 - 因为变量上的 double splat 将空哈希作为第一个参数传递给方法。 @rafaels88
  • 是的,你是对的......我现在按照你的思路做了一些测试,如果你通过foo(**{a: 1})然后h = {a: 1}; foo(**h),行为与传递空哈希不同你通过了你的例子。这似乎是一个错误。非常感谢您的诊断!
猜你喜欢
  • 2017-08-18
  • 1970-01-01
  • 2017-08-25
  • 1970-01-01
  • 2014-07-29
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多