Ошибка при вызове self.puts в Ruby

Рейтинг: 1Ответов: 1Опубликовано: 19.09.2014

Всем доброго дня!

Начал изучать ruby по книге Криса Пайна "Учись программировать". Так вот. Там есть вот такой пример:

iCantBelieveIMadeAVariableNameThisLongJustToPointToA3 = 3
puts iCantBelieveIMadeAVariableNameThisLongJustToPointToA3
self.puts iCantBelieveIMadeAVariableNameThisLongJustToPointToA3

который по словам автора должен вернуть:

3
3

Но в ответ на вызов self.puts я получаю:

3
ex3.rb:8:in '<main>': private method 'puts' called for main:Object <NoMethodError>

Кто-нибудь может по возможности максимально детально объяснить, почему такая конструкция не работает (а также почему работала ранее, если работала)? И почему работает такая:

iCantBelieveIMadeAVariableNameThisLongJustToPointToA3 = 3
puts iCantBelieveIMadeAVariableNameThisLongJustToPointToA3
self.send(:puts, iCantBelieveIMadeAVariableNameThisLongJustToPointToA3)

Заранее огромное вам спасибо!

Ответы

▲ 2Принят

@vladchernik, puts объявлен в Kernel как private. Вы можете вызывать его, но явно использовать контекст (self.), как это можно делать с protected, нельзя. Текущий класс = main.