Why is a = a nil instead of giving NameError

Could someone help me understand what is happening here?

irb(main):001:0> a
NameError: undefined local variable or method `a' for main:Object
        from (irb):1
irb(main):002:0> b
NameError: undefined local variable or method `b' for main:Object
        from (irb):2
irb(main):003:0> c
NameError: undefined local variable or method `c' for main:Object
        from (irb):3
irb(main):004:0> b = c
NameError: undefined local variable or method `c' for main:Object
        from (irb):4
irb(main):005:0> a = a
=> nil

a is undefined, so why does "a = a" work instead of giving a NameError
like "b = c" does?

Also:

irb(main):006:0> b = c
NameError: undefined local variable or method `c' for main:Object
        from (irb):6
irb(main):007:0> b
=> nil

Why did b get initialized to nil if there was a NameError?

Source:

https://www.destroyallsoftware.com/talks/wat

Thanks!
Navin.

···

from :0
        from :0

--
Posted via http://www.ruby-forum.com/.

"Local variables are created immediately when the Ruby parser parses a
left-hand-side local variable. Before the right-hand-side is even
parsed, the local variable has been created. This also results in an
infamous anomaly:

  def say_what?
    x = 'hello' unless defined?(x)
    puts x
  end

say_what? prints a blank line! This is because as soon as the x on the
LHS is parsed, x is a local variable with value nil. By the time
defined?(x) is executed, x has long since been a local variable!"

···

On Fri, Jan 27, 2012 at 6:40 PM, Navindra Umanee <navindra@cs.mcgill.ca> wrote:

Could someone help me understand what is happening here?

irb(main):005:0> a = a
=> nil

a is undefined, so why does "a = a" work instead of giving a NameError
like "b = c" does?

Thanks for that.

I was hoping it was for a cool reason or that it enabled some cool
usage, but seems like it's more of an implementation consequence than
any intentional effect.

···

--
Posted via http://www.ruby-forum.com/.

It enables

a ||= whatever
a &&= whatever

Which I think is "cool", but at the very least, is incredibly useful (the
former more than the latter).

Anyway, in case anyone hasn't seen it, this comes from
https://www.destroyallsoftware.com/talks/wat

···

On Fri, Jan 27, 2012 at 6:56 PM, Navindra Umanee <navindra@cs.mcgill.ca>wrote:

Thanks for that.

I was hoping it was for a cool reason or that it enabled some cool
usage, but seems like it's more of an implementation consequence than
any intentional effect.

--
Posted via http://www.ruby-forum.com/\.