Dumb question about assigments

Hi, I feel kind of dumb for asking this, but I can’t honestly find the
answer anywere.

I came across a attribute defined like:
class BlahBlah
def something=(x,y)
#code
end
end

I tried to assign the values as:
BlahBlah.something=(5,10)
and
BlahBlah.something=5,10
and
BlahBlah.something(5,10)

but all give me a “1 for 2” argument error (except for the last which
don’t work because something is not a method).
All examples I came across either used only one argument, or defined
something as a method (strip the =).

How can I assign values to this tipe of attribute?
thanks

Ruby only allows a single value to be assigned using the = operator.
However, you can assign an array to multiple values:

a, b = [1, 2]
puts a #=> 1
puts b #=> 2

When you try to assign multiple values using the = operator you
defined, Ruby is converting the arguments on the right hand side into
an array; hence the “1 for 2” argument error you mentioned. I would
try something like this

class BlahBlah
def something=( *args )
x, y = args
puts x
puts y
end
end

BlahBlah.new.something = 1
BlahBlah.new.something = 1, 2

#=> 1
#=> nil

#=> 1
#=> 2

In the first assignment, y gets the value of nil.

Hope this helps :slight_smile:

TwP

Tim P. wrote:

Ruby only allows a single value to be assigned using the = operator.
However, you can assign an array to multiple values:
[…]
Hope this helps :slight_smile:

TwP

Yep, that certainly helped, I should smack the programmer in the head
then?, perhaps he placed the = by accident.
Thanks!

Andrew Huh? wrote:

I tried to assign the values as:
BlahBlah.something=(5,10)
and
BlahBlah.something=5,10
and
BlahBlah.something(5,10)

blah = BlahBlah.new
blah.send(:something=, 5, 10)

Though it’s likely a dumb idea to define =-methods in this way.

That is very strange code you’ve posted. I wonder what the original
author intended? The only way I could get a two-argument writer
method to run was as follows:

#! /usr/bin/ruby -w

class M

attr_reader :m

def initialize
   @m = [0, 0]
end

def m=(x, y)
   @m = [x, y]
end

end

foo = M.new
p foo.m => [0, 0]
foo.send(:m=, 1, 2)
p foo.m => [1, 2]

------- end of code --------

The above proves that a two-argument writer can be called (sort of),
but it really doesn’t cast any light on what it would be used for. I
hope some wiser head will clarify this.

Regards, Morton

Morton G. wrote:

The above proves that a two-argument writer can be called (sort of),
but it really doesn’t cast any light on what it would be used for. I
hope some wiser head will clarify this.

Regards, Morton
Now that I know this is not common (I don’t have much real life
experience with ruby), I’m sure he placed the = by accident.

Le 24 juillet 2006 à 18:36, Florian F. a écrit :

Though it’s likely a dumb idea to define =-methods in this way.

Mind you, in some languages (well, at least - don’t shoot ! - Visual
Basic), it allows to type (the equivalent of) blah.something(10) = 5
(first argument is the value assigned, the others passed in the
partenthesis).

Fred

Hi,

At Tue, 25 Jul 2006 09:20:05 +0900,
F. Senault wrote in [ruby-talk:203659]:

Mind you, in some languages (well, at least - don’t shoot ! - Visual
Basic), it allows to type (the equivalent of) blah.something(10) = 5
(first argument is the value assigned, the others passed in the
partenthesis).

It’s tough for ruby parser.

On 7/24/06, Andrew Huh? [email protected] wrote:

I came across a attribute defined like:
class BlahBlah
def something=(x,y)
#code
end
end

How can I assign values to this tipe of attribute?
thanks

Well this is pretty questionable code, but if you need to call it try:

b = BlahBlah.new
b.send :something=, x, y

Good luck
pth

Le 25 juillet 2006 à 09:34, [email protected] a écrit :

Hi,

At Tue, 25 Jul 2006 09:20:05 +0900,
F. Senault wrote in [ruby-talk:203659]:

Mind you, in some languages (well, at least - don’t shoot ! - Visual
Basic), it allows to type (the equivalent of) blah.something(10) = 5
(first argument is the value assigned, the others passed in the
partenthesis).

It’s tough for ruby parser.

Sure, ruby already has plenty of constructs for this purpose. I was
just pointing a possible origin of the idiom.

Fred