Class: OpenStruct
Relationships & Source Files | |
Inherits: | Object |
Defined in: | lib/ostruct.rb, lib/ostruct/version.rb |
Constant Summary
-
InspectKey =
Internal use only
# File 'lib/ostruct.rb', line 316:__inspect_key__
-
VERSION =
# File 'lib/ostruct/version.rb', line 4"0.2.0"
Class Method Summary
-
.new(hash = nil) ⇒ OpenStruct
constructor
Creates a new
OpenStruct
object.
Instance Attribute Summary
-
#table!
readonly
Alias for #table.
- #table (also: #table!) readonly protected Internal use only
-
#modifiable? ⇒ Boolean
readonly
private
Internal use only
Used internally to check if the
OpenStruct
is able to be modified before granting access to the internal Hash table to be modified.
Instance Method Summary
-
#==(other)
Compares this object and
other
for equality. -
#[](name) ⇒ Object
Returns the value of an attribute.
-
#[]=(name, obj) ⇒ Object
Sets the value of an attribute.
-
#delete_field(name)
Removes the named field from the object.
-
#dig(name, ...) ⇒ Object
Extracts the nested value specified by the sequence of
name
objects by callingdig
at each step, returningnil
if any intermediate step isnil
. -
#each_pair {|name, value| ... } ⇒ ostruct
Yields all attributes (as symbols) along with the corresponding values or returns an enumerator if no block is given.
-
#eql?(other) ⇒ Boolean
Compares this object and
other
for equality. - #freeze
-
#hash
Computes a hash code for this
OpenStruct
. -
#inspect
(also: #to_s)
Returns a string containing a detailed summary of the keys and values.
-
#marshal_dump
Provides marshalling support for use by the Marshal library.
-
#marshal_load(x)
Provides marshalling support for use by the Marshal library.
-
#to_h ⇒ Hash
Converts the
OpenStruct
to a hash with keys representing each attribute (as symbols) and their corresponding values. -
#to_s
Alias for #inspect.
-
#initialize_copy(orig)
Internal use only
Duplicates an
OpenStruct
object’s Hash table. - #method_missing(mid, *args) Internal use only
- #respond_to_missing?(mid, include_private = false) ⇒ Boolean Internal use only
-
#new_ostruct_member!(name)
private
Internal use only
Used internally to defined properties on the
OpenStruct
.
Constructor Details
.new(hash = nil) ⇒ OpenStruct
Creates a new OpenStruct
object. By default, the resulting OpenStruct
object will have no attributes.
The optional #hash, if given, will generate attributes and values (can be a Hash, an OpenStruct
or a Struct). For example:
require "ostruct"
hash = { "country" => "Australia", :capital => "Canberra" }
data = OpenStruct.new(hash)
data # => #<OpenStruct country="Australia", capital="Canberra">
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(mid, *args)
# File 'lib/ostruct.rb', line 207
def method_missing(mid, *args) # :nodoc: len = args.length if mname = mid[/.*(?==\z)/m] if len != 1 raise ArgumentError, "wrong number of arguments (given #{len}, expected 1)", caller(1) end modifiable?[new_ostruct_member!(mname)] = args[0] elsif len == 0 # and /\A[a-z_]\w*\z/ =~ mid # if @table.key?(mid) new_ostruct_member!(mid) unless frozen? @table[mid] end elsif @table.key?(mid) raise ArgumentError, "wrong number of arguments (given #{len}, expected 0)" else begin super rescue NoMethodError => err err.backtrace.shift raise end end end
Instance Attribute Details
#modifiable? ⇒ Boolean
(readonly, private)
Used internally to check if the OpenStruct
is able to be modified before granting access to the internal Hash table to be modified.
# File 'lib/ostruct.rb', line 171
def modifiable? # :nodoc: begin @modifiable = true rescue exception_class = defined?(FrozenError) ? FrozenError : RuntimeError raise exception_class, "can't modify frozen #{self.class}", caller(3) end @table end
#table (readonly, protected) Also known as: #table!
# File 'lib/ostruct.rb', line 339
attr_reader :table # :nodoc:
#table! (readonly)
Alias for #table.
# File 'lib/ostruct.rb', line 341
alias table! table
Instance Method Details
#==(other)
Compares this object and other
for equality. An OpenStruct is equal to other
when other
is an OpenStruct
and the two objects’ Hash tables are equal.
require "ostruct"
first_pet = OpenStruct.new("name" => "Rowdy")
second_pet = OpenStruct.new(:name => "Rowdy")
third_pet = OpenStruct.new("name" => "Rowdy", :age => nil)
first_pet == second_pet # => true
first_pet == third_pet # => false
# File 'lib/ostruct.rb', line 356
def ==(other) return false unless other.kind_of?(OpenStruct) @table == other.table! end
#[](name) ⇒ Object
Returns the value of an attribute.
require "ostruct"
person = OpenStruct.new("name" => "John Smith", "age" => 70)
person[:age] # => 70, same as person.age
# File 'lib/ostruct.rb', line 241
def [](name) @table[name.to_sym] end
#[]=(name, obj) ⇒ Object
Sets the value of an attribute.
require "ostruct"
person = OpenStruct.new("name" => "John Smith", "age" => 70)
person[:age] = 42 # equivalent to person.age = 42
person.age # => 42
# File 'lib/ostruct.rb', line 256
def []=(name, value) modifiable?[new_ostruct_member!(name)] = value end
#delete_field(name)
Removes the named field from the object. Returns the value that the field contained if it was defined.
require "ostruct"
person = OpenStruct.new(name: "John", age: 70, pension: 300)
person.delete_field("age") # => 70
person # => #<OpenStruct name="John", pension=300>
Setting the value to nil
will not remove the attribute:
person.pension = nil
person # => #<OpenStruct name="John", pension=nil>
# File 'lib/ostruct.rb', line 305
def delete_field(name) sym = name.to_sym begin singleton_class.remove_method(sym, "#{sym}=") rescue NameError end @table.delete(sym) do raise NameError.new("no field `#{sym}' in #{self}", sym) end end
#dig(name, ...) ⇒ Object
Extracts the nested value specified by the sequence of name
objects by calling dig
at each step, returning nil
if any intermediate step is nil
.
require "ostruct"
address = OpenStruct.new("city" => "Anytown NC", "zip" => 12345)
person = OpenStruct.new("name" => "John Smith", "address" => address)
person.dig(:address, "zip") # => 12345
person.dig(:business_address, "zip") # => nil
data = OpenStruct.new(:array => [1, [2, 3]])
data.dig(:array, 1, 0) # => 2
data.dig(:array, 0, 0) # TypeError: Integer does not have #dig method
# File 'lib/ostruct.rb', line 280
def dig(name, *names) begin name = name.to_sym rescue NoMethodError raise TypeError, "#{name} is not a symbol nor a string" end @table.dig(name, *names) end
#each_pair {|name, value| ... } ⇒ ostruct
#each_pair ⇒ Enumerator
ostruct
#each_pair ⇒ Enumerator
Yields all attributes (as symbols) along with the corresponding values or returns an enumerator if no block is given.
require "ostruct"
data = OpenStruct.new("country" => "Australia", :capital => "Canberra")
data.each_pair.to_a # => [[:country, "Australia"], [:capital, "Canberra"]]
# File 'lib/ostruct.rb', line 147
def each_pair return to_enum(__method__) { @table.size } unless block_given? @table.each_pair{|p| yield p} self end
#eql?(other) ⇒ Boolean
Compares this object and other
for equality. An OpenStruct is eql? to other
when other
is an OpenStruct
and the two objects’ Hash tables are eql?.
# File 'lib/ostruct.rb', line 366
def eql?(other) return false unless other.kind_of?(OpenStruct) @table.eql?(other.table!) end
#freeze
[ GitHub ]# File 'lib/ostruct.rb', line 197
def freeze @table.each_key {|key| new_ostruct_member!(key)} super end
#hash
Computes a hash code for this OpenStruct
. Two OpenStruct objects with the same content will have the same hash code (and will compare using #eql?).
See also Object#hash
.
# File 'lib/ostruct.rb', line 376
def hash @table.hash end
#initialize_copy(orig)
Duplicates an OpenStruct
object’s Hash table.
# File 'lib/ostruct.rb', line 105
def initialize_copy(orig) # :nodoc: super @table = @table.dup end
#inspect Also known as: #to_s
Returns a string containing a detailed summary of the keys and values.
# File 'lib/ostruct.rb', line 321
def inspect ids = (Thread.current[InspectKey] ||= []) if ids.include?(object_id) detail = ' ...' else ids << object_id begin detail = @table.map do |key, value| " #{key}=#{value.inspect}" end.join(',') ensure ids.pop end end ['#<', self.class, detail, '>'].join end
#marshal_dump
Provides marshalling support for use by the Marshal library.
# File 'lib/ostruct.rb', line 156
def marshal_dump @table end
#marshal_load(x)
Provides marshalling support for use by the Marshal library.
# File 'lib/ostruct.rb', line 163
def marshal_load(x) @table = x end
#new_ostruct_member!(name) (private)
Used internally to defined properties on the OpenStruct
. It does this by using the metaprogramming function define_singleton_method for both the getter method and the setter method.
# File 'lib/ostruct.rb', line 187
def new_ostruct_member!(name) # :nodoc: name = name.to_sym unless singleton_class.method_defined?(name) define_singleton_method(name) { @table[name] } define_singleton_method("#{name}=") {|x| modifiable?[name] = x} end name end
#respond_to_missing?(mid, include_private = false) ⇒ Boolean
# File 'lib/ostruct.rb', line 202
def respond_to_missing?(mid, include_private = false) # :nodoc: mname = mid.to_s.chomp("=").to_sym defined?(@table) && @table.key?(mname) || super end
#to_h ⇒ Hash
#to_h {|name, value| ... } ⇒ Hash
Hash
#to_h {|name, value| ... } ⇒ Hash
Converts the OpenStruct
to a hash with keys representing each attribute (as symbols) and their corresponding values.
If a block is given, the results of the block on each pair of the receiver will be used as pairs.
require "ostruct"
data = OpenStruct.new("country" => "Australia", :capital => "Canberra")
data.to_h # => {:country => "Australia", :capital => "Canberra" }
data.to_h {|name, value| [name.to_s, value.upcase] }
# => {"country" => "AUSTRALIA", "capital" => "CANBERRA" }
# File 'lib/ostruct.rb', line 127
def to_h(&block) if block_given? @table.to_h(&block) else @table.dup end end
#to_s
Alias for #inspect.
# File 'lib/ostruct.rb', line 337
alias :to_s :inspect