If you are coming to JRubyArt from vanilla processing, you may not be aware of ruby
Struct, which is an extremly useful way to add structure to data, and can often be used as lighweight alternative to a class eg as replacement for a 2D or 3D Vector class see below:-
Vect = Struct.new(:x, :y) origin = Vect(0, 0)
In two lines we have created a new
Vect and created an instance
Vect. This is the usual way of doing but you may also come across the more verbose form:-
class Vect < Struct.new(:x, :y) end origin = Vect.new(0, 0)
But ruby is so versatile we can even add a
method to our
Struct to create for example a lightweight Boundary class (which can be very useful in JRubyArt sketches):-
Boundary = Struct.new(:lower, :upper) do def include?(x) (lower...upper).cover? x end end
see fern.rb for example usage of our lightweight boundary class.
But there is more, you could use Struct within a factory module to create anonymous data types (but with a particular interface) see below:-
# Hair factory can create anonymous instances of Hair Struct module HairFactory Hair = Struct.new(:z, :phi, :len, :theta) def self.create_hair(radius) z = rand(-radius..radius) phi = rand(0..Math::PI * 2) len = rand(1.15..1.2) theta = Math.asin(z / radius) Hair.new(z, phi, len, theta) end end
see esfera.rb for example usage of our HairyFactory module.
You may also be interested in the even more versatile
OStruct, that takes hash args, but in practice I usually find myself creating a regular ruby class instead.