Ruby Hash.new vs Хэш буквальный
Я вызываю сторонний API (написанный на PHP), проходящий в некоторых парах ключ/значение.
Этот код работает:
h = Hash.new
h['first_name'] = "Firstname"
h['last_name'] = "Lastname"
APICall([h]) # Record gets created
Это не означает:
h = {'first_name' => "Firstname", 'last_name' => "Lastname"}
APICall([h]) # Record does not get created
Когда я выгружаю Hash на консоль в обоих экземплярах, я получаю одну и ту же структуру данных. Так почему же первый способ работает, а второй - нет?
EDIT: Не уверен, что это имеет значение, но я использую Ruby 1.8.7p72/Linux. Также одной из пары ключ/значение является строка изображения с кодировкой Base64.
Ответы
Ответ 1
поскольку документация класса Hash
гласит:
[](*args) public
Создает новый хэш, заполненный данными объектами. Эквивалентно буквальному {key => value,...}. В первой форме ключи и значения встречаются парами, поэтому должно быть четное число аргументов. Вторая и третья формы принимают один аргумент, который представляет собой либо массив пар ключ-значение, либо объект, конвертируемый в хэш.
Hash["a", 100, "b", 200] #=> {"a"=>100, "b"=>200}
Hash[ [ ["a", 100], ["b", 200] ] ] #=> {"a"=>100, "b"=>200}
Hash["a" => 100, "b" => 200] #=> {"a"=>100, "b"=>200}
http://apidock.com/ruby/Hash/%5B%5D/class
Таким образом, по крайней мере, Hash[]
должен иметь такое же поведение, как {...}
Ответ 2
Хэш-литераль не вышел до версии 1.1. Вы используете v1.8.
http://www.ruby-lang.org/en/news/2009/01/30/ruby-1-9-1-released/
Найти эту ссылку для "literal hash syntax":
http://svn.ruby-lang.org/repos/ruby/tags/v1_9_1_0/NEWS
Вот патч для поддержки функции v1.8:
http://bugs.ruby-lang.org/issues/1183