Q
將散列轉換爲結構
37
A
回答
49
如果沒有專門^h AVE是一個Struct
,而是可以是OpenStruct
:
pry(main)> require 'ostruct'
pry(main)> s = OpenStruct.new(h)
=> #<OpenStruct a=1, b=2>
pry(main)> puts s.a, s.b
1
2
8
下面創建從一個可靠的方式散列一個結構(因爲哈希順序沒有紅寶石保證) :
s = Struct.new(*(k = h.keys)).new(*h.values_at(*k))
45
由於散列鍵順序在紅寶石1.9+保證:
Struct.new(*h.keys).new(*h.values)
1
下面就以該值映射到的正確的順序的一例結構:
require 'securerandom'
Message = Struct.new(:to, :from, :message, :invitee)
message_params = {from: "[email protected]", to: "[email protected]",
invitee: SecureRandom.uuid, message: "hello"}
if Message.members.sort == message_params.keys.sort
# Do something with the return struct object here
Message.new *Message.members.map {|k| message_params[k] }
else
raise "Invalid keys for Message"
end
52
如果你已經有一個結構定義,你想用哈希來實例化一個實例:
Person = Struct.new(:first_name, :last_name, :age)
person_hash = { first_name: "Foo", last_name: "Bar", age: 29 }
person = Person.new(*person_hash.values_at(*Person.members))
=> #<struct Person first_name="Foo", last_name="Bar", age=29>
-1
require 'ds_hash'
data = {a: {b: 123 }}.to_struct
data.a.b == 123 # true
data.a == {b: 123 } # true
2
有Hash#to_struct
是相當實用:
class Hash
def to_struct
Struct.new(*keys).new(*values)
end
end
而且一些例子:
>> { a: 1, b: 2 }.to_struct
=> #<struct a=1, b=2>
>> { a: 1, b: 2 }.to_struct.a
=> 1
>> { a: 1, b: 2 }.to_struct.b
=> 2
>> { a: 1, b: 2 }.to_struct.c
NoMethodError: undefined method `c` for #<struct a=1, b=2>
深to_struct
與陣列的工作原理:
class Array
def to_struct
map { |value| value.respond_to?(:to_struct) ? value.to_struct : value }
end
end
class Hash
def to_struct
Struct.new(*keys).new(*values.to_struct)
end
end
+0
它很好,但是如果它的json散列'['name']'需要象徵鍵。 – 7urkm3n 2018-01-31 10:58:51
相關問題
- 1. 將散列轉換爲嵌套散列
- 2. 將散列轉換爲NSString?
- 3. 將IImage轉換爲結構
- 4. 將結構轉換爲JSON
- 5. 將散列陣列轉換爲散列陣列
- 6. Ruby/Rails:將範圍轉換爲散列
- 7. 將var數據轉換爲散列表
- 8. Ruby將字符串轉換爲散列
- 9. Ruby RestClient將XML轉換爲散列
- 10. 防止將散列表轉換爲ASCII
- 11. 將設置文件轉換爲散列
- 12. JavaScript將字符串轉換爲散列
- 13. clojure將lazy-seq轉換爲散列圖
- 14. 將散列轉換爲NSNumberWithInt不一致?
- 15. 將Varchar值轉換爲散列值:varchar
- 16. 將數組轉換爲散列
- 17. 將字符串轉換爲散列圖
- 18. 將多維散列轉換爲csv
- 19. 將數組轉換爲散列
- 20. Javascript。將MD5散列轉換爲整數
- 21. 將PSCustomObject轉換爲散列表
- 22. 如何將activerecord結果轉換爲散列?
- 23. Rails將類似散列的對象轉換爲散列?
- 24. 如何將perl散列轉換爲javascript散列
- 25. 如何將一個散列轉換爲另一個散列?
- 26. 如何將散列數組轉換爲散列值數組?
- 27. 在構建時將C++結構轉換爲C#結構
- 28. 將csv轉換爲JSON樹結構?
- 29. Oracle:將樹結構轉換爲XML
- 30. 將ASP.NET MVC轉換爲n層結構
我從來沒有聽說過'OpenStruct'。太酷了!謝謝! – alf 2012-08-14 23:51:02
請注意OpenStructs的使用速度非常慢。適合少數小物體,但尺寸很差。 一些進一步的信息在這裏: http://stackoverflow.com/questions/1177594/ruby-struct-vs-openstruct – 2014-02-22 22:21:51
@AFaderDarkly我認爲他們的速度問題是有據可查的,但謝謝。 – 2014-02-22 23:15:01