如何处理碰巧是Ruby中关键字的关键字参数?
How to deal with keyword arguments that happen to be keywords in Ruby?
给定以下带有两个关键字参数 begin
和 end
的方法:
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
请注意,这只是一个示例,该问题适用于所有关键字,而不仅仅是 begin
和 end
。
简单的解决方案
请查找其他变量名。 (例如 min
and max
或 range_begin
和 range_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
给定以下带有两个关键字参数 begin
和 end
的方法:
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
请注意,这只是一个示例,该问题适用于所有关键字,而不仅仅是 begin
和 end
。
简单的解决方案
请查找其他变量名。 (例如 min
and max
或 range_begin
和 range_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