Ruby 带关键字的命名参数
Ruby named parameters with keywords
我喜欢使用如下方法签名:
def register(something, on:, for:)
这行得通,但我不知道如何在不导致语法错误的情况下使用 "for"!相当烦人,有人知道解决这个问题的方法吗?
在 Ruby 中,for 是一个保留关键字 - 看起来您不能以其他方式使用它们,而不是它们本来的用途。
这就是保留关键字的全部目的。
在 Ruby 中保留关键字的其他资源:
- http://www.rubymagic.org/posts/ruby-and-rails-reserved-words
- http://www.java2s.com/Code/Ruby/Language-Basics/Rubysreservedwords.htm
- (感谢 @cremno 的评论)两个链接都没有提到 ENCODING。另外,由于2.2.0Ruby自带官方文档:$
ri ruby:keywords
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+。
注意:不要这样做,我只是对您如何绕过它感兴趣,您可能应该将您的命名参数命名为其他名称:)
我喜欢使用如下方法签名:
def register(something, on:, for:)
这行得通,但我不知道如何在不导致语法错误的情况下使用 "for"!相当烦人,有人知道解决这个问题的方法吗?
在 Ruby 中,for 是一个保留关键字 - 看起来您不能以其他方式使用它们,而不是它们本来的用途。 这就是保留关键字的全部目的。
在 Ruby 中保留关键字的其他资源:
- http://www.rubymagic.org/posts/ruby-and-rails-reserved-words
- http://www.java2s.com/Code/Ruby/Language-Basics/Rubysreservedwords.htm
- (感谢 @cremno 的评论)两个链接都没有提到 ENCODING。另外,由于2.2.0Ruby自带官方文档:$
ri ruby:keywords
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+。
注意:不要这样做,我只是对您如何绕过它感兴趣,您可能应该将您的命名参数命名为其他名称:)