如何编写一个将关键字参数与哈希相结合的ruby方法?

时间:2016-12-22 04:04:31

标签: ruby methods hash keyword-argument

我正在设计一个像这样工作的api:

client.entries(content_type: 'shirts', { some: 'query', other: 'more', limit: 5 })

所以我在client课程中使用了这个方法:

def entries(content_type:, query={})
  puts query
end

但我得到syntax error, unexpected tIDENTIFIER

我也尝试过喷溅:

def entries(content_type:, **query)
  puts query
end

但是我得到了

syntax error, unexpected ')', expecting =>...ry', other: 'more', limit: 5 })

在不切换参数顺序的情况下,这样做的正确方法是什么。第二个参数必须是哈希,我不想使用keyword argument作为第二个参数

1 个答案:

答案 0 :(得分:1)

第二部分适用于目前的MRI和JRuby:

def entries(content_type:, **query)
  puts query
end
entries(content_type: 3, baz: 4)
# => {:baz=>4}

第一个无法工作,因为您既不能拥有关键字参数,也会自动将键值对收集到哈希参数中。

编辑回应评论:

如果您想传递哈希而不是将额外的关键字收集到哈希中,那么您需要撤消签名:

def entries(query={}, content_type:)
  puts query
end
entries(content_type: 3)
# => {}
entries({ baz: 4 }, content_type: 3)
# => {:baz=>4}

或者,你可以散布你的哈希:

def entries(content_type:, **query)
  puts query
end
entries(content_type: 3, **{baz: 4})
# => {:baz=>4}

或者,您可以将第二个参数也变为关键字:

def entries(content_type:, query: {})
  puts query
end
entries(content_type: 3)
# => {}
entries(content_type: 3, query: {baz: 4})
# => {:baz=>4}