Note quite, upcase methods are allowed; see:
http://www.ruby-doc.org/core-2.1.2/Kernel.html#method-i-Integer Try
running: Integer -4.2
Consider this code:
a + 1
# we've never seen 'a =' before, so we assume it's a function
# first call a(), then on the resulting object call .+(1)
# same as: a().+(1)
a +1
# <word> <space> <plus> <any> = function call
# same as: a(1.+@())
C + 1
# C starts with a capital, so we assume it's a const
# same as: C.+(1)
C +1
# <word> <space> <plus> <any> = function call
# same as: C(1.+@())
b = 2
b + 1
# we *have* seen 'b =' before, so we know it's an lvar
# same as: b.+(1)
b +1
# <lvar> <space> <plus> <any> = *not* function call
# same as "b + 1": b.+(1)
You could do a similar thing with @x, @@y, or $z. Those are unambiguously
variable names, so they'd never be interpreted as a function.
Have a think about what's going on here, if it helps:
irb(main):001:0> def a(*args) p [:a, *args]; end
irb(main):002:0> def b(*args) p [:b, *args]; end
irb(main):003:0> def C(*args) p [:C, *args]; end
irb(main):004:0> b = 1
irb(main):005:0> C = 99
irb(main):006:0> a +1
[:a, 1]
=> [:a, 1] # a(1.+@())
irb(main):007:0> b +1
=> 2 # b.+(1)
irb(main):008:0> C +1
[:C, 1]
=> [:C, 1] # C(1.+@)
irb(main):009:0> a + 1
[:a]
TypeError: no implicit conversion of Fixnum into Array
from (irb):9:in `+'
from (irb):9
from /usr/local/bin/irb-trunk:11:in `<main>'
# a().+(1)
irb(main):010:0> b + 1
=> 2 # b.+(1)
irb(main):011:0> C + 1
=> 100 # C.+(1)
···
On 21 July 2014 12:09, Juanjo Conti <jjconti@gmail.com> wrote:
I got it!
A can't be a method, because it's upcase!
--
Matthew Kerwin
http://matthew.kerwin.net.au/