Когда вы запускаете ruby -n
, Ruby ожидает два разных файла от STDIN: сценарий (поскольку вы не указали имя сценария Ruby в аргументе или выражение Ruby в -e
) и файл для процесс (из-за -n
). Таким образом, return
не остановит ваш скрипт просто потому, что в этот момент скрипт еще не запущен; return
- это сценарий, и вам нужно подождать, пока вы начнете вводить следующий файл, чтобы return
заработал.
Попробуйте это:
$ ruby -n
puts "ECHO: #{$_}"
return if $. == 2
<Ctrl-D>
hello
# => ECHO: hello
world
# => ECHO: world
$
Ctrl-D в Unix / OSX (Ctrl-Z в Windows) будет указывать конец файла, поэтому Ruby продолжит ввод второго. Таким образом, первые две строки являются сценарием. После того, как вы завершили этот файл, следующая строка (hello
) служит входом для скрипта, и скрипт вернет его обратно. Следующая строка (world
) продолжает ввод для сценария, но теперь счетчик строк $.
показывает, что это вторая строка ввода, return
выполняется, и сценарий заканчивается, как и должно быть.