为什么关键字参数必须作为带符号键的哈希传递,而不是Ruby中的字符串键?

时间:2015-02-12 12:02:15

标签: ruby ruby-2.0 ruby-2.1 keyword-argument

我们不能将关键字参数作为带有字符串键的哈希传递,关键字参数仅作为符号键使用哈希。

一个简单的例子:

def my_method(first_name:, last_name: )
  puts "first_name: #{first_name} | last_name: #{last_name}"
end

my_method( {last_name: 'Sehrawat', first_name: 'Manoj'}) 
#=> first_name: Manoj | last_name: Sehrawat

my_method( {first_name: 'Bob', last_name: 'Marley'})
#=> first_name: Bob | last_name: Marley

my_method( {'first_name' => 'Kumar', 'last_name' => 'Manoj'})
#=> Error: missing keywords: first_name, last_name (ArgumentError)

背后的原因是什么?

3 个答案:

答案 0 :(得分:3)

简短的版本是因为Matz这么说 - 关于这个rubymine issue他评论

  

我对该提案持否定态度。我的观点是你不应该(或不再)使用字符串作为关键字。

实际问题是由于这种情况而发生的事情,但如果Matz说不,它不太可能发生。我不知道他是否进一步阐述了他为什么反对这一点。

答案 1 :(得分:2)

***的实施可能相关:

def gather_arguments(*arguments, **keywords)
  puts "arguments: #{arguments.inspect}"
  puts " keywords: #{keywords.inspect}"
end

gather_arguments('foo' => 1, bar: 2, 'baz' => 3, qux: 4)

输出:

arguments: [{"foo"=>1, "baz"=>3}]
 keywords: {:bar=>2, :qux=>4}

答案 2 :(得分:0)

即使关键字参数可以在哈希中传递,我认为主要用途是直接使用key: value语法:

my_method(first_name: 'Bob', last_name: 'Marley')

就这种形式而言,这里没有符号键(或数组键)。 key: value语法是直接表示关键字参数。

我的推测是,由于此语法与带符号键的哈希值和省略的大括号一致,因此通过带符号键的哈希接受关键字值对也是有意义的。并且它可能是这样设计的,以便与传递带符号键的哈希的技巧兼容,这是在引入此语法之前使用的。