В Ruby, если вы не указали получателя отправленного сообщения, неявным получателем будет всегда self
. (Без исключений.)
Итак, говоря
foo
где foo
не является локальной переменной в текущей лексической области, всегда эквивалентно
self.foo
Однако есть небольшая складка: в Ruby определение метода private
является «методом, который может быть вызван только в результате отправки сообщения без получателя». Таким образом, хотя foo
и self.foo
эквивалентны с точки зрения получателя отправляемого сообщения, могут существовать различия с контролем доступа. В частности, если foo
равно private
, то foo
будет работать, но self.foo
будет raise
NoMethodError
исключение с сообщением (например) NoMethodError (private method `foo' called for main:Object)
.
Итак, вы были правы все время:
puts
эквивалентно
self.puts
но вы неправильно прочитали сообщение об ошибке: метод не существует, просто метод private
.
В частности, все те методы, которые предназначены для того, чтобы больше походить на «процедуры» в том, что они на самом деле не делают ничего интересного со своим получателем, определены в Kernel
и определены как private
методы. Сюда также входят такие методы, как Kernel#print
, Kernel#require
и т. Д.