Consider the following code:
class Stuff
def << (arg1,arg2)
puts arg1
puts arg2
end
end
s = Stuff.new
When doing the following:
s << "1", "2"
Ruby errors with:
stuff:8: parse error, unexpected ',', expecting ')'
When doing:
s << "1"
Ruby expects 2 arguments instead of one (which is right).
But when doing:
s.<< "1", "2"
suddenly everything works. To me, this seems a bit weird, since I
expected that s << is syntactic sugar for s.<<, but the implementation
seems different. Also using <<(*args) in the method definition doesn't
do what I expect it to do. Of course I can work around not using s <<
with multiple arguments, but I'm just curious what the design principles
are behind this behaviour.
Odd << behaviour
on 25.06.2006 20:27
Re: Odd << behaviour
on 25.06.2006 20:49
The discrepancy here bothers me, because all of the Ruby tutorials I have read talk about how you can override operators, but really it is only half true. You can only overide the logic of the operator but not it's arity. This seems unacceptable in my conceptual model of the language, despite the problems with grammar that Logan Capalado brought up on the IRC chat.
Re: Odd << behaviour
on 25.06.2006 21:09
being able to do... a << :arg1, :arg2 is just syntax sugar for doing... a.<<( :arg1, :arg2 ) Using the first version however only works with one argument. mark
Re: Odd << behaviour
on 25.06.2006 21:11
Mark Van Holstyn wrote: > being able to do... > > a << :arg1, :arg2 > > is just syntax sugar for doing... > > a.<<( :arg1, :arg2 ) > > Using the first version however only works with one argument. > > mark Right. The issue I have is more with the implications of that and how operator overriding works.
Re: Odd << behaviour
on 25.06.2006 21:22
It's syntactic sugar. You can't expect it to work with arbitrary arities. It's a bit like complaining that you can't to `1 + 2, 3' in Ruby. << makes sense with one argument. You know that it really just masks an method call. If you are so comfortable with Ruby that you understand what is a method call and what's not, having to use the method call syntax shouldn't be that difficult. Remember, Ruby has lots of more syntax than, say, Smalltalk, but at its core the semantics are, if not as simple, close.
Re: Odd << behaviour
on 25.06.2006 21:34
Simen Edvardsen wrote: > It's syntactic sugar. You can't expect it to work with arbitrary > arities. It's a bit like complaining that you can't to `1 + 2, 3' in > Ruby. << makes sense with one argument. My complaint lies more in the fact that most ruby documentation I have read, doesn't tell you the whole story about operator orriding. They say you can do it, but they neglect to tell you that your syntatic sugar will fail if you want your operator to have a different arity.
Re: Odd << behaviour
on 25.06.2006 21:44
That's because operator overriding isn't an extension of the semantics, but the syntax. Perhaps the documentation ought to make that clear.
Re: Odd << behaviour
on 25.06.2006 21:58
Simen Edvardsen wrote: > That's because operator overriding isn't an extension of the > semantics, but the syntax. Perhaps the documentation ought to make > that clear. I agree with that. The documentation should note that << only overloads or defines the method called "<<", but does not overloads or redefines the syntax of <<. Ofcourse the same goes for other operators like + and -. On the other hand, ruby only gives a syntax error when calling the method and doesn't warn the programmer when defining the method. I think it's logical that ruby warns when programmer when the method is defined, since the example I give on top is completely unuseful.
Re: Odd << behaviour
on 25.06.2006 23:48
On 25-Jun-06, at 3:58 PM, Wouter de Bie wrote: > -. On the other hand, ruby only gives a syntax error when calling the > method and doesn't warn the programmer when defining the method. I > think > it's logical that ruby warns when programmer when the method is > defined, > since the example I give on top is completely unuseful. Why would you want it to warn you when you're defining it? You assume that it'll know how you want to use it, which it cannot know that. -- Jeremy Tregunna jtregunna@blurgle.ca "One serious obstacle to the adoption of good programming languages is the notion that everything has to be sacrificed for speed. In computer languages as in life, speed kills." -- Mike Vanier
Re: Odd << behaviour
on 26.06.2006 03:56
Simen Edvardsen wrote: > That's because operator overriding isn't an extension of the > semantics, but the syntax. Perhaps the documentation ought to make > that clear. Why can't the semantics be extended to cover operators having variable arity?
Re: Odd << behaviour
on 26.06.2006 07:38
Jeremy Tregunna wrote: > Why would you want it to warn you when you're defining it? You assume > that it'll know how you want to use it, which it cannot know that. In the case above, I cannot use the method in any way. Not with one and not with multiple arguments. Shouldn't be too hard to figure out that this method can not be used..
