加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 当子元素不是数组时,splat参数后需要可选的关键字参数

发布时间:2020-12-17 02:57:26 所属栏目:百科 来源:网络整理
导读:根据这个 post,在splat参数之后可以有一个可选的关键字参数.如果splat参数引入了一个数组数组,但是当它是一个哈希数组时,它就可以工作 例如,如果被调用的方法被定义为 def call(*scores,alpha: nil) puts scoresend 然后这个工作 scores = [[1,2],[3,4]]call
根据这个 post,在splat参数之后可以有一个可选的关键字参数.如果splat参数引入了一个数组数组,但是当它是一个哈希数组时,它就可以工作

例如,如果被调用的方法被定义为

def call(*scores,alpha: nil)
  puts scores
end

然后这个工作

scores = [[1,2],[3,4]]
call(*scores)

但事实并非如此

scores = [ {a: 1},{b: 3}]
call(*scores)

给出以下(与ruby2.4.4)

ArgumentError: unknown keyword: b

但这很有效

scores = [ {a: 1},{b: 3}]
call(*scores,alpha: nil)

这里出了什么问题?

解决方法

splat运算符将数组拆分为参数.

但是,如果你将它包装在一个数组中它再次工作,但现在它是一个数组内的数组,仍然被视为传递给你的方法的单个参数.

call([*scores]) #no error

但也要说明为什么你得到错误看看这里发生了什么:

def call(*scores,alpha: nil)
  puts scores.inspect
end

call(*scores[0]) #=> #[[:a,1]]

更新:感谢@Stefan,错误的原因实际上是您的方法接受关键字参数,这显然是一个已知的错误.见Keyword arguments unpacking (splat) in Ruby

你的上一个例子的工作原理是,通过将第二个参数传递给你的方法,splat将第一个参数作为一个数组处理,而不是试图将它分成两个参数.

更多见Ruby,Source Code of Splat?

另见https://www.rubyguides.com/2018/07/ruby-operators/#Ruby_Splat_Operator

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读