Ruby Hash.new vs Hash literal - PullRequest
       0

Ruby Hash.new vs Hash literal

12 голосов
/ 21 февраля 2012

Я вызываю сторонний 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

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

РЕДАКТИРОВАТЬ: Не уверен, что это важно, но я использую Ruby 1.8.7p72 / Linux.Также одной из пары ключ / значение является строка изображения в кодировке Base64.

Ответы [ 2 ]

1 голос
/ 21 февраля 2012

как указано в документации класса Hash:

[](*args) public

Создает новый хэш, заполненный данными объектами. Эквивалентно буквальному значению {key =>,…}. В первой форме ключи и значения встречаются парами, поэтому должно быть четное число аргументов.Вторая и третья формы принимают один аргумент, который является либо массивом пар ключ-значение, либо объектом, конвертируемым в хеш.

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[] должен иметь то же поведение, что и {...}

0 голосов
/ 08 марта 2012

Хеш-литерал не выходил до v1.9. Вы используете v1.8.

http://www.ruby -lang.org / ен / Новости / 2009/01/30 / рубин-1-9-1 выпущен /

Поиск по этой ссылке для "синтаксиса литерального хэша":

http://svn.ruby -lang.org / репо / рубин / теги / v1_9_1_0 / NEWS

Вот патч, позволяющий перенести функцию в v1.8:

http://bugs.ruby -lang.org / вопросы / 1183

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