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. 防止將散列表轉換爲ASCII
- 2. Ruby RestClient將XML轉換爲散列
- 3. 將Varchar值轉換爲散列值:varchar
- 4. 將PSCustomObject轉換爲散列表
- 5. 將var數據轉換爲散列表
- 6. Ruby將字符串轉換爲散列
- 7. 如何將activerecord結果轉換爲散列?
- 8. 如何將散列數組轉換爲散列值數組?
- 9. Rails將類似散列的對象轉換爲散列?
- 10. 如何將一個散列轉換爲另一個散列?
- 11. 解析YAML般的文本文件轉換成散列結構
- 12. 如何將jbyteArray轉換爲結構?
- 13. 將ColdFusion結構轉換爲XML
- 14. 將JSON數據轉換爲ColdFusion結構
- 15. ColdFusion將表單值轉換爲結構
- 16. Swift:將結構轉換爲JSON?
- 17. 如何將PWCHAR轉換爲FILETIME結構?
- 18. 將KeyEventArgs轉換爲KEYDBINPUT結構
- 19. 將C結構轉換爲FFI :: Struct
- 20. 將C++結構轉換爲C#
- 21. Elixir:將結構轉換爲erlang for sys.config
- 22. C將樹結構轉換爲JSON
- 23. 將Go結構轉換爲JSON
- 24. 將tm結構轉換爲boost :: local_time :: local_date_time
- 25. 將enum轉換爲類層次結構
- 26. 在Golang中將結構轉換爲JSON
- 27. 將結構轉換爲數組
- 28. 將ASP.NET MVC轉換爲n層結構
- 29. 將PHP數組轉換爲SOAP結構
- 30. 將嵌套結構轉換爲平面?
我從來沒有聽說過'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