Forum: Ruby Syntax suggestion

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
jbc (Guest)
on 2007-06-07 09:46
(Received via mailing list)
(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?
Joel VanderWerf (Guest)
on 2007-06-07 10:30
(Received via mailing list)
jbc wrote:
> 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.
unknown (Guest)
on 2007-06-07 14:51
(Received via mailing list)
Hi --

On Thu, 7 Jun 2007, Joel VanderWerf wrote:

>>
>> 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
Gavin K. (Guest)
on 2007-06-07 19:10
(Received via mailing list)
On Jun 7, 12:29 am, Joel VanderWerf <removed_email_address@domain.invalid> 
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"
Robert D. (Guest)
on 2007-06-07 19:36
(Received via mailing list)
On 6/7/07, Phrogz <removed_email_address@domain.invalid> 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
Daniel DeLorme (Guest)
on 2007-06-07 20:00
(Received via mailing list)
Phrogz wrote:
> 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
Robert K. (Guest)
on 2007-06-07 20:11
(Received via mailing list)
On 07.06.2007 07:42, jbc wrote:
> 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
This topic is locked and can not be replied to.