Class: Raindrops::Struct
- Inherits:
-
Object
- Object
- Raindrops::Struct
- Defined in:
- lib/raindrops/struct.rb
Overview
This is a wrapper around Raindrops objects much like the core Ruby Struct can be seen as a wrapper around the core Array class. It’s usage is similar to the core Struct class, except its fields may only be used to house unsigned long integers.
class Foo < Raindrops::Struct.new(:readers, :writers)
end
foo = Foo.new 0, 0
foo.incr_writers -> 1
foo.incr_readers -> 1
Direct Known Subclasses
Class Method Summary collapse
-
.new(*members) ⇒ Object
returns a new class derived from Raindrops::Struct and supporting the given
members
as fields, just like Struct.new in core Ruby.
Class Method Details
.new(*members) ⇒ Object
returns a new class derived from Raindrops::Struct and supporting the given members
as fields, just like Struct.new in core Ruby.
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
# File 'lib/raindrops/struct.rb', line 20 def self.new(*members) members = members.map { |x| x.to_sym }.freeze str = <<EOS def initialize(*values) (MEMBERS.size >= values.size) or raise ArgumentError, "too many arguments" @raindrops = Raindrops.new(MEMBERS.size) values.each_with_index { |val,i| @raindrops[i] = values[i] } end def initialize_copy(src) @raindrops = src.instance_variable_get(:@raindrops).dup end def []=(index, value) @raindrops[index] = value end def [](index) @raindrops[index] end def to_hash ary = @raindrops.to_ary rv = {} MEMBERS.each_with_index { |member, i| rv[member] = ary[i] } rv end EOS members.each_with_index do |member, i| str << "def incr_#{member}; @raindrops.incr(#{i}); end; " \ "def decr_#{member}; @raindrops.decr(#{i}); end; " \ "def #{member}; @raindrops[#{i}]; end; " \ "def #{member}=(val); @raindrops[#{i}] = val; end; " end klass = Class.new klass.const_set(:MEMBERS, members) klass.class_eval(str) klass end |