|
|
 |
 |
 |
 |
Ruby Programming Language
|
 |
 |
 |
 |
 |
 |
 |
 |
Syntax suggestion
(I posted this before on the google-group rather than the usenet group, but it seems not to have shown up. I don't know why. If this is a duplicate for anyone, my apologies) def initialize(foo,bar,bat) @foo,@bar,@bat = foo,bar,bat end Seems clumsy and not at all DRY. What would seem the obvious approach to me would be this: def initialize(@foo,@bar,@bat) end Is there a reason it's not done that way?
jbc wrote: > (I posted this before on the google-group rather than the usenet > group, but it seems not to have shown up. I don't know why. If this is > a duplicate for anyone, my apologies) > def initialize(foo,bar,bat) > @foo,@bar,@bat = foo,bar,bat > end > Seems clumsy and not at all DRY. > What would seem the obvious approach to me would be this: > def initialize(@foo,@bar,@bat) > end > Is there a reason it's not done that way?
This has been discussed on ruby-talk, but it might have been a few years ago. You can do this: class Foo define_method :initialize do |@x,@y,@z| end end p Foo.new(1,2,3) # ==> #<Foo:0xb7cce1e4 @x=1, @z=3, @y=2> You might want to verify that this construct is allowed in 1.9 before using it heavily. ISTR it is deprecated. If a method has more than two positional arguments, I tend to look for alternatives. YMMV of course. -- vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407
Hi --
On Thu, 7 Jun 2007, Joel VanderWerf wrote: > jbc wrote: >> (I posted this before on the google-group rather than the usenet >> group, but it seems not to have shown up. I don't know why. If this is >> a duplicate for anyone, my apologies) >> def initialize(foo,bar,bat) >> @foo,@bar,@bat = foo,bar,bat >> end >> Seems clumsy and not at all DRY. >> What would seem the obvious approach to me would be this: >> def initialize(@foo,@bar,@bat) >> end >> Is there a reason it's not done that way? > This has been discussed on ruby-talk, but it might have been a few years ago.
It's also a rejected RCR: http://oldrcrs.rubypal.com/rejected.html#rcr3 David -- Q. What is THE Ruby book for Rails developers? A. RUBY FOR RAILS by David A. Black (http://www.manning.com/black) (See what readers are saying! http://www.rubypal.com/r4rrevs.pdf) Q. Where can I get Ruby/Rails on-site training, consulting, coaching? A. Ruby Power and Light, LLC (http://www.rubypal.com)
On Jun 7, 12:29 am, Joel VanderWerf <v@path.berkeley.edu> wrote: > class Foo > define_method :initialize do |@x,@y,@z| end > end > p Foo.new(1,2,3) # ==> #<Foo:0xb7cce1e4 @x=1, @z=3, @y=2> > You might want to verify that this construct is allowed in 1.9 before > using it heavily. ISTR it is deprecated.
Can someone confirm or deny that this is deprecated in 1.9? Not just the specific case above, but the general functionality that block parameters can be instance variables, setting the instance variable as a side-effect of just invoking the block. For example: p @a #=> nil 3.times{ |@a| } p @a #=> 2 p VERSION #=> "1.8.5"
On 6/7/07, Phrogz <g@refinery.com> wrote: <snip> > Can someone confirm or deny that this is deprecated in 1.9?
I remember Matz saying some times ago that it is deprecated. I did not post this before b/c I just cannot come up with a URL :( But I remember distinctively as I really liked the syntax :(( Robert -- You see things; and you say Why? But I dream things that never were; and I say Why not? -- George Bernard Shaw
Phrogz wrote: > On Jun 7, 12:29 am, Joel VanderWerf <v @path.berkeley.edu> wrote: >> class Foo >> define_method :initialize do |@x,@y,@z| end >> end >> p Foo.new(1,2,3) # ==> #<Foo:0xb7cce1e4 @x=1, @z=3, @y=2> >> You might want to verify that this construct is allowed in 1.9 before >> using it heavily. ISTR it is deprecated. > Can someone confirm or deny that this is deprecated in 1.9?
yep, deprecated: $ ruby1.9 -e ' class Foo define_method(:initialize) do |@x,@y,@z| end end' formal argument cannot be an instance variable define_method(:initialize) do |@x,@y,@z| end Daniel
On 07.06.2007 07:42, jbc wrote:
> (I posted this before on the google-group rather than the usenet > group, but it seems not to have shown up. I don't know why. If this is > a duplicate for anyone, my apologies) > def initialize(foo,bar,bat) > @foo,@bar,@bat = foo,bar,bat > end > Seems clumsy and not at all DRY. > What would seem the obvious approach to me would be this: > def initialize(@foo,@bar,@bat) > end > Is there a reason it's not done that way?
See the other replies for explanations. I want to show an alternative: Foo = Struct.new :foo, :bar, :bat f=Foo.new 1,2,3 You'll also get comparison logic and hashing for free. And you can even define methods on the class directly like this: Foo = Struct.new :foo, :bar, :bat do def size foo + bar + bat end end I use that pretty often because it saves even more typing than just the initialize code. :-) Kind regards robert
|
 |
 |
 |
 |
|