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

为什么在Ruby中,关键字参数必须作为带有符号键的散列传递,而不是字符串键?,ruby,ruby-2.0,ruby-2.1,keyword-argument,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: Se

我们不能用字符串键作为哈希传递关键字参数,关键字参数只能用哈希作为符号键

一个简单的例子:

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)

它背后的原因是什么?

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

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


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

简短版本可能是因为Matz这么说的——在这个rubymine上他评论道

我不赞成这个建议。我的意见是,你不应该(或不再)使用字符串作为关键字


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

实施
*
**
可能与此相关:

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}

我认为这个想法类似于@freemanoid,我不这么认为。在本例中,语法是关于如何接受局部变量的。没有涉及符号。您是说字符串键是保留的,以便它们可以与关键字参数区分开来,并解释为散列参数的一部分吗?如果是这样,我不同意。@sawa我不是说这是原因。如果允许使用带字符串键的关键字参数,则
*
**
的当前行为将发生变化(可能会破坏现有代码)。1.9中的
符号:key
语法确实是专门作为向“真实”关键字参数的迁移路径引入的。