簡體   English   中英

Ruby哈希數組返回鍵而不是值?

[英]Ruby hash array returning key instead of value?

[1] pry(main)> o.items
=> [{"78"=>"{\"size\"=>\"96\", \"side\"=>[]}"}]

[2] pry(main)> o.items[0]
=> {"78"=>"{\"size\"=>\"96\", \"side\"=>[]}"}

[3] pry(main)> o.items[0]['78']
=> "{\"size\"=>\"96\", \"side\"=>[]}"

[4] pry(main)> o.items[0]['78']["side"]
=> "side"

第4行不是應該返回一個空數組嗎? 它返回的“邊”又如何?

編輯

我發現在保存哈希數組(這是Postgresql上的hstore數組)后會發生這種情況。

例如,這將按預期返回哈希值。

o.items << {78 => {"size" => 1, "side" => []}}
o.items
=> [{"78"=> {"size"=>"1", "side"=>[]}}]  

但是保存后

o.save
o.items
=> [{"78"=>"{\"size\"=>\"96\", \"side\"=>[]}"}]

我最終做了eval(o.items [0] ['78'])將字符串轉換回哈希,然后再對哈希進行任何更改並進行更新。 這似乎非常不必要,是否有更好的選擇?

正如評論者所指出的那樣,問題出在數據類型上。 您以為該值是字符串時就認為該值是哈希值。 轉義的雙引號是這里的線索。

"{\"size\"=>\"96\", \"side\"=>[]}"

{"size"=>"96", "side"=>[]}

看到不同?

當您有一個字符串並使用String#[]方法訪問它時,如果存在,它將返回該字符串。 該文件說:

If a match_str is given, that string is returned if it occurs in the string.

檢查此鏈接以獲取更多詳細信息: http : //ruby-doc.org/core-2.3.0/String.html#method-i-5B-5D

如果將其保存到Rails屬性中,則需要正確處理此類數據。 最好使用以下方法之一完成此操作:

  • 使用JSON列類型存儲任意結構。
  • serialize標記該列以處理任意數據。

MySQL 5.7和Postgres 9.3或更高版本支持JSON作為列類型,因此,如果可能的話,我會朝着這個方向發展。 如果不是這樣,請使用常規的TEXT列和serialize選項。

這樣可以將您的結構保存為ActiveRecord將重新構造回其原始格式的格式。 您將不必處理字符串化的哈希。

您在這里無意間絆到的是String#[]方法,該方法可以采用多種選項,但是其中之一是要匹配的子字符串。 在您的情況下,Ruby hash-as-string包含您要查找的短語,就像這樣:

string = "ruby has strings"

string["ruby"]
# => "ruby"

string["test"]
# => nil

為了方便起見, []方法用於各種事物,盡管這種特殊用法經常被忽略。

警告 :使用eval從字符串中重建哈希實際上是最后的選擇,並且如果有其他方法,無論它有多么尷尬或不便,都應避免使用。 評估任意字符串是一個巨大的責任,就像任何東西都應該進入可以被評估為代碼的東西一樣,很容易危及您的系統。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM