From: "trans. (T. Onoma)" Date: 2004-10-20T08:31:13+09:00 Subject: Re: Too many default argument values! My word I'm looking at almost the same problem! I wish we had real named parameters. But in the mean time try: def rect(x, y, width, height) # ... yield(self) # ... end rect(10,10,100,100){ |r| r.rx=0; r.ry=0; r.fill='red' } At least I think that's how it's done. For even more "inner" control: def rect(x, y, width, height, &yld) # ... instance_eval &yld # ... end rect(10,10,100,100){ @rx=0; @ry=0; @fill='red' } These aren't tested so sorry if I made any mistakes, but you get the idea at least. T. On Tuesday 19 October 2004 07:04 pm, Tim Hunter wrote: | 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? -- ( o _ カラチ // trans. / \ transami@runbox.com I don't give a damn for a man that can only spell a word one way. -Mark Twain