How +:symbol is parsed

  • Thread starter Victor \Zverok\ Shepelev
  • Start date
V

Victor \Zverok\ Shepelev

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.
 
A

Alex LeDonne

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,264
Messages
2,571,316
Members
48,002
Latest member
DoloresMan

Latest Threads

Top