Class: Ramaze::Struct

Inherits:
Struct
  • Object
show all
Defined in:
lib/ramaze/snippets/ramaze/struct.rb

Direct Known Subclasses

LRUHash

Instance Method Summary collapse

Instance Method Details

#values_at(*keys) ⇒ Object

Makes it possible to access the keys directly by their name, not only their index. The original Struct#values_at tries to call #to_int on the arguments. in Ruby < 1.9 this would lead to a quite unintuitive IndexError, while in 1.9 it will say outright that it cannot convert Symbol into Integer. I think this is neither useful nor expected, so we extend Struct#values_at to recognize valid members of the Struct passed into the method and return their values in the same order, just like Hash#values_at.

Example:

Point = Struct.new(:x, :y)
point = Point.new(15, 10)

# Old behaviour:
point.values_at(0, 1)
# => [15, 10]
point.values_at(0..1)
# => [15, 10]
point.values_at(:y, :x)
# => IndexError: offset 20697 too large for struct(size:2)

# Added new behaviour:
point.values_at(:y, :x)
# => [10, 15]


34
35
36
37
38
39
40
41
42
43
# File 'lib/ramaze/snippets/ramaze/struct.rb', line 34

def values_at(*keys)
  keys.map do |key|
    case key
    when String, Symbol
      self[key]
    else
      return super
    end
  end
end