Ответ tl; dr в том, что оба они верны. Просто больше вещей происходит в REPL.
Когда вы запускаете код из командной строки, как:
ruby script.rb
Все, что происходит, это то, что это e
Принимая во внимание, что REPL, такие как IRB r , читают ваш ввод, e оценивают его и p набирают его в l oop.
В этом случае e оценка вашего кода буквально нарушила REPL и привела к последующей ошибке p .
Теперь вы можете быть немного смущены этим. «В обоих случаях есть отпечаток, я использую puts
!». Отпечаток, на который я ссылаюсь здесь, является результатом, который визуализируется после каждой e оценки. В этом случае результат определения метода (=> :method_missing
).
Это может быть не только сама печать p . Это может быть тонна другого кода под капотом, который должен выполнить REPL, чтобы сохранить состояние вроде «какой код был определен для какой строки» и т. Д.
Подумайте, что вытолько что сделал - вы сделали так, чтобы каждый объект имел каждый метод, который можно вернуть nil
. Это не только для кода, который вы пишете в REPL. Это для кода из самого REPL.