--------------enig91A1DD531F2507F32A81B5DE
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

paul wrote:

> The new rule, written into my brain: methodes
> whose names end in '=' 

Read: assignments.

> always return the first argument.

As assignments do.

Don't think about attribute writes as methods.  Don't write them as
methods, it just looks ugly and confuses people, apparently including
you ;;P

> Writing this
> down made me think: with multiple arguments, does it return them all,
> or just the first. I gave it a try, and it seems like I'm not allowed
> to give more then one argument to an methodes whose names end in '='. 

That's because you're not calling the method per se. You're doing an
attribute write. The Ruby parser reads it as an assignment. The rvalue
isn't even being suspected of being a parenthetised argument list.

In your code, xx.x=('y', 'z') probably gets parsed as:
	xx.x = ('y', 'z'),
where the assignment rvalue ('y', 'z') is invalid Ruby.

You're not allowed to have attribute setters take two parameters,
because it's a syntax feature to set a value to an attribute.

Just as a variable always points to -one- object, an attribute points to
one object as well.

Methods with identifiers ending in = are a special case. They're a
special case for (what I think are) good reasons, and it makes precious
little sense whatsoever to try to use them outside the context of that
special case - such use would be nonidiomatic, and confusing. Most
people reading your code using attribute setters as chained calls would
first cringe, then run it through a code beautifier to at least put a
space around the =, and then visually parse it in the completely wrong
way (as an assignment) if they acted as regular method calls.

> Can anyone confirm this as a rule?
> 
> [snip code - speaking of which, please indent irb snippets too]

Also:

irb(main):001:0> class Foo
irb(main):002:1>   def bar=(baz, bat)

irb(main):003:2>     puts "Foo#bar= called with arguments baz=#{baz} and
bat=#{Bat}"
irb(main):004:2>     return 'bing'
irb(main):005:2>   end
irb(main):006:1> end
=> nil
irb(main):007:0>
irb(main):008:0* foo = Foo.new
=> #<Foo:0x5bf151c>
irb(main):009:0> foo.bar = 1, 2
ArgumentError: wrong number of arguments (1 for 2)
        from (irb):9:in `bar='
        from (irb):9
        from :0

Multiple items as the rvalue of an assignment expression are always
packed into an array as varargs:

C:\Documents and Settings\David>irb
irb(main):001:0> class Foo
irb(main):002:1>   def bar=(baz)
irb(main):003:2>     puts "Foo#bar= called with baz=#{baz.inspect}
irb(main):004:2>     return :bing
irb(main):005:2>   end
irb(main):006:1> end
=> nil
irb(main):007:0> Foo.new.bar = 1, 2
Foo#bar= called with baz=[1, 2]
=> [1, 2]

David Vallner


--------------enig91A1DD531F2507F32A81B5DE
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (MingW32)

iD8DBQFFdzNmy6MhrS8astoRApzOAJ9by2k/lrizysTPPaAGJiMb0tJ5pQCeO0EW
OT2teC2ZnoSq9lAeiFiXQyg
3k
-----END PGP SIGNATURE-----

--------------enig91A1DD531F2507F32A81B5DE--