From: Alex LeDonne Date: 2007-08-21T07:22:19+09:00 Subject: Re: How +:symbol is parsed On 8/20/07, Victor Zverok Shepelev wrote: > Hi. > > I wanted to be evil and add my own custom semantics to +:some_symbol > constructs. But I've found such consctructs doesn't call Symbol#+@, while > +(:some_symbol) does call. > > I can suppose it's reason of numbers construction in parser > > +3 #doesn't calls Fixnum#+@, it's like Finxum.new(+3), > +(3) #does calls Fixnum#+@, it's like Fixnum.new(3).+@ > > but it's still strange for me this rule works for symbols too (but not for > strings, +"test" calls String#+@). Can somebody please explain this > strangeness? > > Thanks. > > V. > Well, I haven't looked at parse.y, but I'll wager that the difference between 3 and "test" is that, for numeric literals, a preceding + or - is considered the sign of the literal number. That is, +3 is a number all by itself, whereas +"test" doesn't make sense unless the + is a method call. There's also no method call when a number is in exponential notation like -4.3e+11 . In ruby-ancient times, a symbol was more like an integer, which may or may not explain the +:symbol semantics. -A