Q:

Why is a space allowed between minus and a number?

These are expected:
-3 # => -3
0 - 3 # => -3

But what is happening here:
- 3 # => -3

My first thoughts was - is a method on the implied self, i.e. self.-(3), so defined on Kernel or Object. But trying this results in NoMethodError: undefined method.

A:

Ruby has a pretty forgiving syntax and allows things like this. That's parsed as a unary minus operator. It negates whatever's on the right hand side.
Also similar:
-(3)
# => -3
-(-(-3))
# => -3
- (3)
# => -3

It's similar to how you can omit braces on method calls: foo x is valid, but foo(x) is implied. You can also do foo (x) though that can lead to ambiguity so it's generally frowned upon.
As Dave Newton points out, internally this is actually:
3.send(:-@)

