2015-07-01 7 views
-1

Допустим у меня есть рубин хэш в стиле Савон ответ мыло XML для хэшированияОтображение нескольких хэш-ключей обозначения

hash1= { node1­: {node­2:{node3:1­,node4:2}}­} 

теперь показать, что эта окрошка

hash1[:nod­e1][:node2­][:node3] 

работ и выходов => 1

hash1[:nod­e1][:node2­][:node4] 

работы и выход => 2

hash1[:nod­e1][:node2­][:node3][:node4] 

дает TypeError

хотя я видел, что тип кода на Савон сценариев. Что он не работает в моей ситуации?

ответ

2

hash1[:nod­e1][:node2­][:node3][:node4] является вызовом метода [] на

hash1[:nod­e1][:node2­][:node3].

Его эквивалент пытается 1[:node4]. Метод на целое принимает Fixnum и не может неявно преобразовать символ (или строку и т. Д.) В целое число.

+0

Не могли бы вы объяснить более подробно, пожалуйста? Я не понимаю. Где я могу найти этот метод [] задокументирован? Кроме того, я увидел этот код [здесь] (http://stackoverflow.com/questions/4153215/parsing-soap-response-using-savon-response-to-hash-conversion-method), где в последней строке он делает all_data = hres [: response] [: asses_data] [: date] [: amount] [: assesReference] [: year] [: cusOffCode] [: serie] [: number] [: date] [: time]. Как это возможно, а не в моем примере? –

+0

osman ссылается на метод [Fixnum # []] (http://ruby-doc.org//core-2.2.0/Fixnum.html#method-i-5B-5D). –

+0

thnx для указания на это, но я до сих пор не понимаю, как он используется в хэше из савона, который имеет ту же структуру, что и моя, и я не могу использовать это на моем хэше. Я не понимаю, что этот метод делает в этом контексте. Если бы кто-нибудь мог это объяснить, я был бы признателен. –

0

Эти многократно вложенные хэши трудно читать, не так ли? Давайте немного изменим ваш хэш:

hash1= { 
    node1­: { 
    node­2: { node3:1­, node4:2 } 
    }­ 
    } 

So: Значение node1 само по себе является хэшем. Единственная запись в этом хеше, node2, также имеет хэш для значения. Этот хэш имеет две записи: node3 и node4, оба из которых имеют целые числа в качестве значений.

So hash1[:node1][:node2]{node3:1, node4:2}. И hash1[:node1][:node2][:node3] возвращает 1.

Но hash1[:node1][:node2][:node3][:node4] не имеет никакого смысла, потому что 1 не является хешем и поэтому не имеет ключа :node4. Этот ключ принадлежит кэш-памяти :node2.

Это будет иметь смысл если у вас есть hash1= { node1­: {node­2: {node3: {node4:2} }}­}. Но вы этого не сделаете.

Как я уже сказал, эти вложенные хеши - это боль, чтобы читать ...

+0

Это имеет смысл, хотя причина, о которой я прошу, заключается не в том, что я считаю их трудными для чтения, а потому, что я видел этот код здесь, где в последней строке он делает all_data = hres [: response] [: asses_data] [: дата] [сумма] [: assesReference] [: год] [: cusOffCode] [: серия] [: число] [: дата] [время]. Как это возможно?Он имеет ту же структуру хэша (xml для вложенного хэша, который выводится аналогично моему примеру, или я ошибаюсь?) –

+0

@PenelopeAetherMitsubishi - ну, я не видел хеш, о котором идет речь, но логическое предположение заключается в том, t то же, что и хэш в вашем примере. Я имею в виду, что '... [: date]' скорее всего, возвращает хэш, содержащий ключ ': time'. Или я не вижу, как это может когда-либо работать. –