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

ruby – 处理一个带有可选参数的方法,后跟一个关键字参数列表

发布时间:2020-12-17 03:10:58 所属栏目:百科 来源:网络整理
导读:我想传递一个可选参数(任何数据类型,甚至是哈希),然后是一个方法的关键字参数列表(可以为空). 这就是我得到的: def my_method(subject = nil,**options) [subject,options]end 在以下情况下,方法输出符合预期: 没什么 my_method()# = [nil,{}] 一个主题 my
我想传递一个可选参数(任何数据类型,甚至是哈希),然后是一个方法的关键字参数列表(可以为空).

这就是我得到的:

def my_method(subject = nil,**options)
  [subject,options]
end

在以下情况下,方法输出符合预期:

>没什么

my_method()
# => [nil,{}]

>一个主题

my_method('foo')
# => ["foo",{}]

>一个有选项的文字主题

my_method('foo',bar: 'bar')
# => ["foo",{:bar=>"bar"}]

>哈希作为主题与选项

my_method({foo: 'foo'},bar: 'bar')
# => [{:foo=>"foo"},{:bar=>"bar"}]

>没有主题,只有选项

my_method(bar: 'bar')
# => [nil,{:bar=>"bar"}]

当传递Hash作为主题而没有选项时,期望的结果是:

my_method({foo: 'foo'})
# => [{:foo=>"foo"},{}]

但我得到以下内容;我没有得到正确的主题:

my_method({foo: 'foo'})
# => [nil,{:foo=>"foo"}]

my_method(foo:’foo’)是否相当于my_method({foo:’foo’})?关于如何获得理想结果的任何想法?

解决方法

请参阅,您有**选项作为参数,没有任何默认值&第一个参数有默认值.所以要理解以下单个论证案例,

无论何时传递单个参数,都会尝试分配给第二个参数(因为第一个参数保持默认值为nil)&如果由于类型不匹配而失败则将其分配给第一个参数.这就是my_method(4)的工作方式.

现在假设您将单个参数作为哈希传递,匹配以分配给第二个参数然后当然它被分配给第二个参数&首先是设置默认值为nil.

如果你想使它工作,那么你可以做,

> my_method({sd: 4},{})
 => [{:sd=>4},{}]

或者你可以在传球时提供参数名称,

> my_method(subject: {sd: 4})
 => [{:sd=>4},{}]

(编辑:李大同)

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

    推荐文章
      热点阅读