Ruby 带关键字的命名参数

Ruby named parameters with keywords

我喜欢使用如下方法签名:

def register(something, on:, for:)

这行得通,但我不知道如何在不导致语法错误的情况下使用 "for"!相当烦人,有人知道解决这个问题的方法吗?

在 Ruby 中,for 是一个保留关键字 - 看起来您不能以其他方式使用它们,而不是它们本来的用途。 这就是保留关键字的全部目的。

在 Ruby 中保留关键字的其他资源:

UPD

实际上,您仍然可以使用 :for 符号作为散列中的键(比方说,选项散列),因此,您可以这样写:

def test(something, options = {})
  puts something
  puts options.values.join(' and ')
end 

而且效果很好:

[4] pry(main)> test 'arguments', :for => :lulz, :with => :care, :while => 'you are writing code' 
arguments
lulz and care and you are writing code

问题不在于您发布的方法定义行,问题在于方法主体中 for 变量的使用。由于 for 是保留字,您不能将其用作普通变量名,但可以将其用作散列的一部分。在您的情况下,这意味着您必须求助于使用任意关键字参数 (**opts),但您可以在方法调用中使用 keyword_argument for:。如果密钥不存在,您可能想要引发 ArgumentError 以模拟您在上面发布的方法签名的行为。

def register(something, on:, **opts)
  raise ArgumentError, 'missing keyword: for' unless opts.has_key?(:for)
  for_value = opts[:for]

  puts "registering #{something} on #{on} for #{for_value}"
end

register 'chocolate chips', on: 'cookie'
# ArgumentError: missing keyword: for

register 'chocolate chips', on: 'cookie', for: 'cookie monster'
# registering chocolate chips on cookie for cookie monster
binding.local_variable_get(:for)

是我的想法。我认为只适用于 ruby 2.1+。

注意:不要这样做,我只是对您如何绕过它感兴趣,您可能应该将您的命名参数命名为其他名称:)