Class: OpenStruct
Overview
OpenStruct allows you to create data objects and set arbitrary attributes. For example:
require 'ostruct'
record = OpenStruct.new
record.name = "John Smith"
record.age = 70
record.pension = 300
puts record.name # -> "John Smith"
puts record.address # -> nil
It is like a hash with a different way to access the data. In fact, it is implemented with a hash, and you can initialize it with one.
hash = { "country" => "Australia", :population => 20_000_000 }
data = OpenStruct.new(hash)
p data # -> <OpenStruct country="Australia" population=20000000>
Constant Summary collapse
- InspectKey =
:nodoc:
:__inspect_key__
Instance Method Summary collapse
-
#==(other) ⇒ Object
Compare this object and
other
for equality. -
#delete_field(name) ⇒ Object
Remove the named field from the object.
-
#initialize(hash = nil) ⇒ OpenStruct
constructor
Create a new OpenStruct object.
-
#initialize_copy(orig) ⇒ Object
Duplicate an OpenStruct object members.
-
#inspect ⇒ Object
(also: #to_s)
Returns a string containing a detailed summary of the keys and values.
- #marshal_dump ⇒ Object
- #marshal_load(x) ⇒ Object
-
#method_missing(mid, *args) ⇒ Object
:nodoc:.
- #new_ostruct_member(name) ⇒ Object
Constructor Details
#initialize(hash = nil) ⇒ OpenStruct
Create a new OpenStruct object. The optional hash
, if given, will generate attributes and values. For example.
require 'ostruct'
hash = { "country" => "Australia", :population => 20_000_000 }
data = OpenStruct.new(hash)
p data # -> <OpenStruct country="Australia" population=20000000>
By default, the resulting OpenStruct object will have no attributes.
46 47 48 49 50 51 52 53 54 |
# File 'lib/framework/ostruct.rb', line 46 def initialize(hash=nil) @table = {} if hash for k,v in hash @table[k.to_sym] = v new_ostruct_member(k) end end end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(mid, *args) ⇒ Object
:nodoc:
91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
# File 'lib/framework/ostruct.rb', line 91 def method_missing(mid, *args) # :nodoc: mname = mid.id2name len = args.length if mname.chomp!('=') if len != 1 raise ArgumentError, "wrong number of arguments (#{len} for 1)", caller(1) end modifiable[new_ostruct_member(mname)] = args[0] elsif len == 0 @table[mid] else raise NoMethodError, "undefined method `#{mname}' for #{self}", caller(1) end end |
Instance Method Details
#==(other) ⇒ Object
Compare this object and other
for equality.
147 148 149 150 |
# File 'lib/framework/ostruct.rb', line 147 def ==(other) return false unless(other.kind_of?(OpenStruct)) return @table == other.table end |
#delete_field(name) ⇒ Object
Remove the named field from the object.
109 110 111 |
# File 'lib/framework/ostruct.rb', line 109 def delete_field(name) @table.delete name.to_sym end |
#initialize_copy(orig) ⇒ Object
Duplicate an OpenStruct object members.
57 58 59 60 |
# File 'lib/framework/ostruct.rb', line 57 def initialize_copy(orig) super @table = @table.dup end |
#inspect ⇒ Object Also known as: to_s
Returns a string containing a detailed summary of the keys and values.
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
# File 'lib/framework/ostruct.rb', line 118 def inspect str = "#<#{self.class}" ids = (Thread.current[InspectKey] ||= []) if ids.include?(object_id) return str << ' ...>' end ids << object_id begin first = true for k,v in @table str << "," unless first first = false str << " #{k}=#{v.inspect}" end return str << '>' ensure ids.pop end end |
#marshal_dump ⇒ Object
62 63 64 |
# File 'lib/framework/ostruct.rb', line 62 def marshal_dump @table end |
#marshal_load(x) ⇒ Object
65 66 67 68 |
# File 'lib/framework/ostruct.rb', line 65 def marshal_load(x) @table = x @table.each_key{|key| new_ostruct_member(key)} end |
#new_ostruct_member(name) ⇒ Object
80 81 82 83 84 85 86 87 88 89 |
# File 'lib/framework/ostruct.rb', line 80 def new_ostruct_member(name) name = name.to_sym unless self.respond_to?(name) class << self; self; end.class_eval do define_method(name) { @table[name] } define_method("#{name}=") { |x| modifiable[name] = x } end end name end |