A
ara.t.howard
NAME
attributes.rb
URIS
http://rubyforge.org/projects/codeforpeople/
http://codeforpeople.com/lib/ruby
SYNOPSIS
attributes.rb provides an attr_* like method will several user friendly
additions. attributes.rb is similar to the traits.rb package but sacrafices
a few features for simplicity of implementation: attributes.rb is only 42
lines of code.
the implimentation of attributes.rb borrows many of the best ideas from the
metakoans.rb ruby quiz
http://www.rubyquiz.com/quiz67.html
in particular the solutions of Christian Neukirchen and Florian Gross.
SAMPLES
<========< samples/a.rb >========>
~ > cat samples/a.rb
#
# basic usage is like attr, but note that attribute defines three methods,
# getter, setter, and query
#
require 'attributes'
class C
attribute 'a'
end
c = C.new
c.a = 42 # setter
p c.a # getter
p 'forty-two' if c.a? # query
~ > ruby samples/a.rb
42
"forty-two"
<========< samples/b.rb >========>
~ > cat samples/b.rb
#
# default values may be given either directly or as a block which will be
# evaluated in the context of self. in both cases (value or block) the
# default is set only once and only if needed - it's a lazy evaluation.
#
require 'attributes'
class C
attribute :a => 42
attributeb){ Float a }
end
c = C.new
p c.a
p c.b
~ > ruby samples/b.rb
42
42.0
<========< samples/c.rb >========>
~ > cat samples/c.rb
#
# multiple values may by given, plain names and key/val pairs may be mixed.
#
require 'attributes'
class C
attributes 'x', 'y' => 0b101000, 'z' => 0b10
end
c = C.new
c.x = c.y + c.z
p c.x
~ > ruby samples/c.rb
42
<========< samples/d.rb >========>
~ > cat samples/d.rb
#
# a nice feature is that all attributes are enumerated in the class. this,
# combined with the fact that the getter method is defined so as to delegate
# to the setter when an argument is given, means bulk initialization and/or
# attribute traversal is very easy.
#
require 'attributes'
class C
attributes %w( x y z )
def attributes
self.class.attributes
end
def initialize
attributes.each_with_index{|a,i| send a, i}
end
def to_hash
attributes.inject({}){|h,a| h.update a => send(a)}
end
def inspect
to_hash.inspect
end
end
c = C.new
p c.attributes
p c
c.x 'forty-two'
p c.x
~ > ruby samples/d.rb
["x", "y", "z"]
{"x"=>0, "y"=>1, "z"=>2}
"forty-two"
-a
attributes.rb
URIS
http://rubyforge.org/projects/codeforpeople/
http://codeforpeople.com/lib/ruby
SYNOPSIS
attributes.rb provides an attr_* like method will several user friendly
additions. attributes.rb is similar to the traits.rb package but sacrafices
a few features for simplicity of implementation: attributes.rb is only 42
lines of code.
the implimentation of attributes.rb borrows many of the best ideas from the
metakoans.rb ruby quiz
http://www.rubyquiz.com/quiz67.html
in particular the solutions of Christian Neukirchen and Florian Gross.
SAMPLES
<========< samples/a.rb >========>
~ > cat samples/a.rb
#
# basic usage is like attr, but note that attribute defines three methods,
# getter, setter, and query
#
require 'attributes'
class C
attribute 'a'
end
c = C.new
c.a = 42 # setter
p c.a # getter
p 'forty-two' if c.a? # query
~ > ruby samples/a.rb
42
"forty-two"
<========< samples/b.rb >========>
~ > cat samples/b.rb
#
# default values may be given either directly or as a block which will be
# evaluated in the context of self. in both cases (value or block) the
# default is set only once and only if needed - it's a lazy evaluation.
#
require 'attributes'
class C
attribute :a => 42
attributeb){ Float a }
end
c = C.new
p c.a
p c.b
~ > ruby samples/b.rb
42
42.0
<========< samples/c.rb >========>
~ > cat samples/c.rb
#
# multiple values may by given, plain names and key/val pairs may be mixed.
#
require 'attributes'
class C
attributes 'x', 'y' => 0b101000, 'z' => 0b10
end
c = C.new
c.x = c.y + c.z
p c.x
~ > ruby samples/c.rb
42
<========< samples/d.rb >========>
~ > cat samples/d.rb
#
# a nice feature is that all attributes are enumerated in the class. this,
# combined with the fact that the getter method is defined so as to delegate
# to the setter when an argument is given, means bulk initialization and/or
# attribute traversal is very easy.
#
require 'attributes'
class C
attributes %w( x y z )
def attributes
self.class.attributes
end
def initialize
attributes.each_with_index{|a,i| send a, i}
end
def to_hash
attributes.inject({}){|h,a| h.update a => send(a)}
end
def inspect
to_hash.inspect
end
end
c = C.new
p c.attributes
p c
c.x 'forty-two'
p c.x
~ > ruby samples/d.rb
["x", "y", "z"]
{"x"=>0, "y"=>1, "z"=>2}
"forty-two"
-a