【问题标题】:How to deal with keyword arguments that happen to be keywords in Ruby?如何处理碰巧是 Ruby 中的关键字的关键字参数?
【发布时间】:2017-01-23 10:58:58
【问题描述】:

假设以下方法采用两个关键字参数beginend

def make_range(begin: 0, end: -1)
  # ...
end

我可以调用这个方法没有问题:

make_range(begin: 2, end: 4)

但是在实现该方法时如何使用关键字参数,因为两者恰好都是Ruby keywords

这显然行不通:

def make_range(begin: 0, end: -1)
  begin..end
end

请注意,这只是一个示例,该问题适用于所有关键字,而不仅仅是beginend

【问题讨论】:

  • 或者,使用 kwargskwargs[:begin]/kwargs[:end]。您将不得不对参数的正确性和默认值进行老式检查。

标签: ruby keyword keyword-argument


【解决方案1】:

简单的解决方案

请查找其他变量名称。 (例如minmaxrange_beginrange_end

复杂的解决方案

local_variable_get

你可以使用binding.local_variable_get

def make_range(begin: 0, end: 10)
  (binding.local_variable_get(:begin)..binding.local_variable_get(:end))
end

p make_range(begin: 10, end: 20)
#=> 10..20

关键字参数/哈希参数

您也可以使用keyword arguments

def make_range(**params)
  (params.fetch(:begin, 0)..params.fetch(:end, 10))
end

p make_range
#=> 0..10
p make_range(begin: 5)
#=> 5..10
p make_range(end: 5)
#=> 0..5
p make_range(begin: 10, end: 20)
#=> 10..20

【讨论】:

  • 应该是params.fetch(:begin, 0),你可以用**params代替params = {}
  • 你为什么还要问你是否知道答案? :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-28
  • 2016-12-01
  • 2020-03-25
  • 1970-01-01
  • 2017-08-08
  • 2014-01-09
相关资源
最近更新 更多