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

ruby – 如何将哈希项映射到方法参数?

发布时间:2020-12-17 03:54:21 所属栏目:百科 来源:网络整理
导读:我有一个带有冗长可选参数列表的方法,例如: def foo(foo = nil,bar = nil,baz = nil,qux = nil) # no-opend 我认为调用方法并将分割哈希作为参数传递会通过将键与方法参数匹配来将哈希项映射到参数: params = { bar: 'bar',foo: 'foo' }foo(*params) 不幸
我有一个带有冗长可选参数列表的方法,例如:

def foo(foo = nil,bar = nil,baz = nil,qux = nil)
    # no-op
end

我认为调用方法并将分割哈希作为参数传递会通过将键与方法参数匹配来将哈希项映射到参数:

params = { bar: 'bar',foo: 'foo' }
foo(*params)

不幸的是,当我在使用拆分哈希调用方法后检查局部变量时,如果我传入一个split数组,我会得到我所期望的,但这不是我希望的:

foo == [:bar,'bar'] # hoped: foo == 'foo'
bar == [:foo,'foo'] # hoped: bar == 'bar'

我在这里缺少什么?

解决方法

(这个答案指的是当问题被问到时最新的Ruby版本.请参阅编辑今天的情况.)

Ruby不支持按名称传递参数. splat operator(*)通过调用to_ary扩展任意可枚举,并将结果拼接到参数列表中.在您的情况下,您传入的可枚举是一个哈希,它被转换为一个键值对数组:

[2] pry(main)> params.to_a
=> [[:bar,"bar"],[:foo,"foo"]]

所以函数的前两个参数将是值[:bar,“bar”]和[:foo,“foo”](不管它们的参数名称是什么!).

如果你想在Ruby中使用类似于关键字参数的东西,你可以利用在将哈希作为最后一个参数传递给函数时不需要大括号的事实:

def foo(opts = {})
    bar = opts[:bar] || <default>
    foo = opts[:foo] || <default>
    # or with a lot of parameters:
    opts = { :bar => <default>,:foo => <default>,... }.merge(opts)
end

foo(foo: 3)  # equivalent to foo({ foo: 3 })

编辑:

从版本2.0开始,Ruby现在支持named arguments使用专用语法.感谢用户jgoyon指出了这一点.

(编辑:李大同)

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

    推荐文章
      热点阅读