如何处理碰巧是Ruby中关键字的关键字参数?

How to deal with keyword arguments that happen to be keywords in Ruby?

给定以下带有两个关键字参数 beginend 的方法:

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

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

make_range(begin: 2, end: 4)

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

这显然行不通:

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

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

简单的解决方案

请查找其他变量名。 (例如 min and maxrange_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