Class: OpenStruct
- Inherits:
-
Object
- Object
- OpenStruct
- Defined in:
- lib/ostruct.rb
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
otherfor 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/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:
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
# File 'lib/ostruct.rb', line 79 def method_missing(mid, *args) # :nodoc: mname = mid.id2name len = args.length if mname =~ /=$/ if len != 1 raise ArgumentError, "wrong number of arguments (#{len} for 1)", caller(1) end if self.frozen? raise TypeError, "can't modify frozen #{self.class}", caller(1) end mname.chop! self.new_ostruct_member(mname) @table[mname.intern] = 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.
142 143 144 145 |
# File 'lib/ostruct.rb', line 142 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.
102 103 104 |
# File 'lib/ostruct.rb', line 102 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/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.
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
# File 'lib/ostruct.rb', line 111 def inspect str = "#<#{self.class}" Thread.current[InspectKey] ||= [] if Thread.current[InspectKey].include?(self) then str << " ..." else first = true for k,v in @table str << "," unless first first = false Thread.current[InspectKey] << v begin str << " #{k}=#{v.inspect}" ensure Thread.current[InspectKey].pop end end end str << ">" end |
#marshal_dump ⇒ Object
62 63 64 |
# File 'lib/ostruct.rb', line 62 def marshal_dump @table end |
#marshal_load(x) ⇒ Object
65 66 67 68 |
# File 'lib/ostruct.rb', line 65 def marshal_load(x) @table = x @table.each_key{|key| new_ostruct_member(key)} end |
#new_ostruct_member(name) ⇒ Object
70 71 72 73 74 75 76 77 |
# File 'lib/ostruct.rb', line 70 def new_ostruct_member(name) name = name.to_sym unless self.respond_to?(name) = class << self; self; end .send(:define_method, name) { @table[name] } .send(:define_method, :"#{name}=") { |x| @table[name] = x } end end |