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

Man*_*wat 6 ruby keyword-argument ruby-2.0 ruby-2.1

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

一个简单的例子:

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)
Run Code Online (Sandbox Code Playgroud)

它背后的原因是什么?

Fre*_*ung 5

简短的版本是因为 Matz 这么说 - 在这个 ruby​​mine问题上他发表了评论

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

实际的问题是由此而发生的事情,但如果马茨说不,那就不太可能发生。不知道他是否进一步阐述了他反对的原因。


saw*_*awa 0

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

my_method(first_name: 'Bob', last_name: 'Marley')
Run Code Online (Sandbox Code Playgroud)

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

我的猜测是,由于这种语法与带有符号键的哈希一致并且省略了大括号,因此通过带有符号键的哈希来接受关键字值对也是有意义的。可能的情况是,它的设计目的是与使用符号键传递散列的技巧兼容,该技巧在引入此语法之前就已使用。