Putting everything in a default hash is sort of a bad idea.
------------------------- code -------------------------
[ummaycoc@localhost ummaycoc]$ ruby -e '
DEFAULT_ARGS = {:foo => :meow, :santa => :love}.freeze
puts("-" * 50)
p DEFAULT_ARGS
def test(arg1, opt_args=DEFAULT_ARGS)
puts "Test: #{opt_args.inspect}"
end
puts
test(:hey)
puts
test(:two, :foo => 1, :ruby => :language)'
--------------------------------------------------
{:santa=>:love, :foo=>:meow}
Test: {:santa=>:love, :foo=>:meow}
Test: {:ruby=>:language, :foo=>1}
------------------------- end code -------------------------
Actually using it, you lose the fact that santa maps to love (thus
everything in the `optional' hash is `mandatory')
a much better idea would be:
DEFAULT_HASH = { ... }
def myFunc(arg1, ..., argN, optHash={})
DEFAULT_HASH.keys.each {|k|
optHash[k] = DEFAULT_HASH[k] unless optHash.include?(k)
}
....
end
This gives you what you actually want. I hope.
On Wed, 20 Oct 2004 18:24:24 +0900, Robert Klemme <bob.news / gmx.net> wrote:
>
> "Tim Hunter" <cyclists / nc.rr.com> schrieb im Newsbeitrag
> news:j%gdd.27795$zA3.4433422 / twister.southeast.rr.com...
> > Looking for coding style advice...
> >
> > I'm trying to write a method that describes a rectangle. A rectangle is
> > defined by the x,y coordinates of its upper-left corner and its width
> and
> > height. These values are required. Optionally, the rectangle can have
> > "styles," like the fill color and the stroke color. Also optionally, the
> > rectangle can have rounded corners, if you specify how much rounding you
> > want in the x and y directions. (The default is square corners.)
> >
> > The method I started with is:
> >
> > def rect(x, y, width, height, rx=0, ry=0, styles=nil)
> > # blah, blah, blah
> > end
> >
> > Where the styles argument (if present) is a Hash formed by the usual
> > trailing key=>value pairs. All very standard Ruby.
> >
> > I was thinking that you'd create a square-corner rectangle like this:
> >
> > canvas.rect(10, 10, 20, 30, :fill=>'black', :stroke='red')
> >
> > But of course that doesn't work, because the styles hash
> > "{:fill=>'black', :stroke=>'red'}" gets assigned to rx, not to styles.
> >
> > Of course, within rect I could test the class of rx and/or ry and if
> it's a
> > Hash, assign it to styles, but that seems kludgy and insufficiently
> > Rubyish. I could divide rect into two methods, rect and rounded_rect,
> but
> > that means that the user has to remember an extra method name. I could
> make
> > rx and ry required arguments. Blech.
> >
> > Thoughts?
>
> Put all (optional) args into the hash and use a default hash
>
> def rect(x, y, width, height, args={:rx=>0, :ry=>0})
> # blah, blah, blah
> p x
> p y
> p width
> p height
> p args
> end
>
> Alternative with slightly better performance:
>
> DEFAULT_RECT_ARGS = {
> :rx => 0,
> :ry => 0,
> }.freeze
>
> def rect(x, y, width, height, args=DEFAULT_RECT_ARGS)
> ....
>
> >> rect(10, 10, 20, 30, :fill=>'black', :stroke=>'red')
> 10
> 10
> 20
> 30
> {:stroke=>"red", :fill=>"black"}
>
> or even
>
> def rect(args=DEFAULT_RECT_ARGS)
> ....
>
> Kind regards
>
> robert
>
>
--
There's no word in the English language for what you do to a dead
thing to make it stop chasing you.