class Aws::Structure
#=> {:name=>“John”, :age=>40, :friend=>{:name=>“Jane”, :age=>40}}
person.to_h
)
friend: Structure.new(name: “Jane”, age: 40, friend: nil)
age: 40,
name: “John”,
person = Structure.new(
conversion of Structure objects into hashes.
Calling {#to_h} or {#to_hash} on a Structure object performs a deep
## Hash Conversion
person1.class == person2.class
person2 = Structure.new(name: ‘Jane Doe’, age: 40)
person1 = Structure.new(name: ‘John Doe’, age: 40)
automatically.
In addition to simpler object construction, struct classes are re-used
## Structure Classes
#=> #<struct>
struct = Structure.new({})
Structure solves this by introducing the EmptyStructure class.
The stdlib Struct class does not work with empty member lists.
## Empty Structures
#=> #<struct name=“John Doe”, age=40>
person = Structure.new(name: ‘John Doe’, age: 40)
You can construct a Structure with a simple hash.
## Construction
A utilty class that makes it easier to work with Struct objects.
def from_hash(value)
- Api: - private
def from_hash(value) case value when Hash data = value.each.with_object({}) do |(key, value), hash| hash[key] = from_hash(value) end Symbol === data.keys.first ? new(data) : data when Array value.map { |v| from_hash(v) } else value end end
def new(*args)
-
(EmptyStructure)
- -
(Struct)
- -
(Struct)
- -
(Struct)
-
Overloads:
-
new()
-
new(members)
-
new(*member_names)
-
new(member_names)
Parameters:
-
members
(Hash
) -- A hash of member names -
member_names
(Symbol
) -- A list of member names. -
member_names
(Array
) -- An array of member names.
def new(*args) members, values = parse_args(args) if members.empty? && self == Structure EmptyStructure.new else struct_class = @@classes[members] if struct_class.nil? @@classes_mutex.synchronize do struct_class = members.empty? ? super(:_) : super(*members) @@classes[members] = struct_class end end struct_class.new(*values) end end
def parse_args(args)
def parse_args(args) case args.count when 0 then [[], []] when 1 then parse_single_arg(args.first) else [args, []] end end
def parse_single_arg(arg)
def parse_single_arg(arg) case arg when Array then [arg, []] when Hash then [arg.keys, arg.values] else [[arg], []] end end
def to_h(obj = self)
-
(Hash)
-
def to_h(obj = self) case obj when Struct obj.members.each.with_object({}) do |member, hash| value = obj[member] hash[member] = to_hash(value) unless value.nil? end when Hash obj.each.with_object({}) do |(key, value), hash| hash[key] = to_hash(value) end when Array obj.collect { |value| to_hash(value) } else obj end end