Object.new.instance_eval { some_accessor_that_does_not_exist= "a value" }
This is interpreted as a creation of new local var named some_accessor_that_does_not_exist
, not a setter invocation. When you use assignments with implicit receiver, ruby can't know if you wanted to create a local var or call a method, because there's no special syntax for declaring local vars. And so it creates a local var.
But when you use explicit receiver (self.some_accessor_that_does_not_exist
), then ruby interprets it as a method and fails.