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
membersas 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 = "def initialize(*values)\n(MEMBERS.size >= values.size) or raise ArgumentError, \"too many arguments\"\n@raindrops = Raindrops.new(MEMBERS.size)\nvalues.each_with_index { |val,i| @raindrops[i] = values[i] }\nend\n\ndef initialize_copy(src)\n@raindrops = src.instance_variable_get(:@raindrops).dup\nend\n\ndef []=(index, value)\n@raindrops[index] = value\nend\n\ndef [](index)\n@raindrops[index]\nend\n\ndef to_hash\nary = @raindrops.to_ary\nrv = {}\nMEMBERS.each_with_index { |member, i| rv[member] = ary[i] }\nrv\nend\n" 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 |