Непоследовательное создание неявного хеша в Ruby? - PullRequest
8 голосов
/ 15 мая 2010

Хорошо, я сравнивал некоторые вещи в моем собственном DSL с Ruby. Одна конструкция, которую они оба поддерживают, это

x=["key" => "value"]

Зная разницу между массивами и хешами, я бы подумал, что это незаконно, но результат в Ruby равен

[{"key" => "value"}]

Почему это? И с этим своего рода синтаксисом, почему вы не можете сделать

x=("key" => "value") 

Почему массив является особым случаем для неявно созданных хэшей?

Ответы [ 3 ]

2 голосов
/ 15 мая 2010

Другой особый случай - вызов функции, рассмотрим:

def f(x)
  puts "OK: #{x.inspect}"
end
f("foo" => "bar")
=> OK: {"foo"=>"bar"}

Таким образом, в некоторых контекстах хеши могут быть созданы неявно (путем обнаружения оператора =>?). Я полагаю, что ответ заключается в том, что это было наименее удивительное поведение Матца.

2 голосов
/ 18 июня 2011

С этим очевидным несоответствием в создании неявного хэша ruby ​​достигает последовательности в этом отношении:

func(whatever...)

всегда можно заменить на:

args = [whatever...]
func(*args)

Вы можете конвертировать между списками аргументов и массивами, и поэтому логично, что они имеют одинаковый синтаксис.

0 голосов
/ 15 мая 2010

Я бы сказал, что интерпретатор выяснит, что «ключ» => «значение» является хешем, так же, как он выяснил бы, что 5 - число, когда вы помещаете его в массив.
Так что если вы напишите:

x = [5]

Интерпретатор не будет думать, что это строка, и возвращает:

x = ["5"]

Похоже, что в некоторых случаях ruby ​​неявно создает хэши.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...