【问题标题】:Passing splat on nil as argument在 nil 上传递 splat 作为参数
【发布时间】:2014-07-22 00:56:00
【问题描述】:

下面b 的所有值让我使用*args 语法调用方法。

def some_method(a)
   puts a
end

b = 1
some_method(*b) # => 1

b = false
some_method(*b) # => false

b = "whatever"
some_method(*b) # => "whatever"

使用nil,我希望得到nil,而不是参数错误:

b = nil
some_method(*b) # => ArgumentError: wrong number of arguments (0 for 1)

这里发生了什么?

【问题讨论】:

  • 有趣的是,这破坏了引用透明度,尝试使用b = *nil; method(b) 效果很好。
  • 在一个不太相关的注释中,我会担心调用方法method。它对我的pry 做了一些可怕的事情(开始打印:inspect)。我假设你不会正常这样做,但我认为这很有趣,所以我想我会提到它,如果有人能告诉我是什么原因造成的,我会很感兴趣。
  • 好吧,我不认为我真的能做到这一点。问题是我正在做一些元编程,其中经过的东西可能是 any 值,包括 nil,但可能是数组。所以我有点需要它是method(*b)。是的,方法的名称“方法”并不好。这里只是一个例子。
  • 我怀疑它可能有一些东西,而 nil 不是一个合适的对象或其他东西。但很高兴知道。
  • 我同意很高兴知道,这就是为什么我想密切关注这个问题(以及为什么我支持你),但是在这种情况下,你可以通过有一个额外的一行写着b= *b,因为这会将nil 强制转换为[],并使数组保持不变。

标签: ruby arguments null splat


【解决方案1】:

splat 运算符* 首先将to_a 应用于对象,如果它不是数组并且在其上定义了to_a。对于数字、假类和字符串,to_a 没有定义,它们仍然是它们自己。对于 nilclass,to_a 被定义并返回一个空数组。当它们被喷溅时,数字、假类和字符串仍然是它们自己,但空数组变得没有任何东西。另请参阅this question 的回复。

【讨论】:

猜你喜欢
  • 2011-07-22
  • 2015-05-11
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 2020-01-06
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
相关资源
最近更新 更多