2015-02-12 5 views
5

Мы не можем передавать аргументы ключевого слова как хэш с помощью строковых ключей, аргументы ключевого слова работают только с хешем в качестве символьных ключей.Почему аргументы ключевого слова должны передаваться как хэш с символьными клавишами, а не строковыми ключами в Ruby?

Простой пример:

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) 

Что такое рассуждение за этим стоит?

+0

Я думаю, что идея похожа на http://stackoverflow.com/questions/8189416/why- use-symbols-as-hash-keys-in-ruby – freemanoid

+0

@freemanoid Я так не думаю. В этом случае синтаксис заключается в том, как принять локальную переменную. Символа нет. – sawa

ответ

1

Даже если ключевые аргументы могут быть переданы в хэше, я думаю, что в первую очередь предполагаемое использование является использование key: value синтаксиса непосредственно:

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

Насколько эта форма связана, то нет ключа символов (или массив). Синтаксис key: value - это прямое обозначение аргументов ключевого слова.

Мое предположение состоит в том, что, поскольку этот синтаксис совпадает с хешем с символьными клавишами и пропущенными фигурными скобками, имеет смысл также принимать пары значений ключевых слов через хэш с символьными клавишами. И это может быть так, что он был разработан так, чтобы быть совместимым с трюком передачи хеша с символьными клавишами, который использовался до того, как был введен этот синтаксис.

+0

Возможно, это неправильно. Извините, если это так. – sawa

+1

Синтаксис 'symbol: key' в 1.9 действительно был введен * специально * в качестве пути перехода к« реальным »аргументам ключевого слова. –

2

Короткая версия будет, потому что Мац говорит так - на этой RubyMine issue он комментирует

Я негативна для предложения. Мое мнение состоит в том, что вы не должны (или не более) использовать строки в качестве ключевых слов.

Настоящая проблема связана с чем-то, что происходит в результате этого, но если Мац говорит, что это вряд ли произойдет. Я не знаю, разъяснил ли он далее, почему он против этого.

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} 
+0

Вы говорите, что строковые ключи зарезервированы так, что их можно отличить от аргументов ключевого слова формы и интерпретироваться как часть хеш-аргументов? Если это так, я не согласен. – sawa

+1

@sawa Я не говорю, что это причина. Просто, что текущее поведение '*' и '**' изменило бы (и, возможно, сломало бы существующий код), если бы были разрешены аргументы ключевого слова со строковыми ключами. – Stefan