Хорошо, таким образом, я сравнивал некоторый материал в своем собственном DSL к Ruby. Одна конструкция они оба поддержка является этим
x=["key" => "value"]
Зная различие между массивами и хешами, я думал бы, что это недопустимо, но результат в Ruby
[{"key" => "value"}]
Почему это? И с этим видом синтаксиса, почему Вы не можете сделать
x=("key" => "value")
Почему массив является особым случаем для неявно созданных хешей?
Другой особый случай - вызов функции, учтите:
def f(x)
puts "OK: #{x.inspect}"
end
f("foo" => "bar")
=> OK: {"foo"=>"bar"}
Таким образом, в некоторых контекстах хэши могут быть построены неявно (путем обнаружения = >
оператор?). Я полагаю, ответ заключается в том, что это было наименее удивительным поведением Маца.
Я бы сказал, что интерпретатор понимает, что "ключ" => "значение" - это хэш, точно так же, как он понимает, что 5 - это число, когда вы помещаете его в массив.
Так что если вы напишете:
x = [5]
Интерпретатор не будет думать, что это строка, и вернет:
x = ["5"]
Похоже, что ruby неявно создает хэши в некоторых случаях.