2010-01-01 5 views
3

Ruby имеет константы и глобальные переменные для stdio.Ruby stdio consts и globals, в чем польза?

А именно, consts STDIN, STDOUT, STDERR и их переменные аналоги, $stdin, $stdout, $stderr.

Я понимаю разницу между константой и переменной. Я знаю, что константы неизменно устанавливаются в дескрипторы файла в тот момент, когда скрипт был exec'd.

Я также понимаю, что вы можете изменить (некоторые) переменные во время выполнения.

Мне любопытно относительно практического использования такой функции. Зачем вам это делать? Что вы можете достичь?

Видя некоторые примеры кода или даже просто используемые случаи, извлеченные из проектов в реальном мире, было бы замечательно.


Update: Из того, что я понимаю, до сих пор, кажется, что при написании собственных библиотек/программ, вы должны предпочесть использовать переменные над константами, так что пользователи могут далее гадость с ним. Правильно?

ответ

3

Более сложный вариант этой функции используется в производстве код:

#!/usr/bin/env ruby -rstringio 

def capture_stdout 
    $stdout = StringIO.new 
    begin 
    yield 
    $stdout.string 
    ensure 
    $stdout = STDOUT 
    end 
end 

output = capture_stdout do 
    print "Line" 
    puts " 1" 
end 

p output  # => "Line 1\n" 

Он используется в модульных тестов, которые хотят знайте, что было написано на консоли, используя print или puts.

В $ переменные позволяют дать объекты рубин разного IO для стандартного вывода, STDIN, STDERR:

$stdout = buffer 

констант позволяют легко получить $ переменные обратно в их первоначальное (при запуске вашей программы) значение:

$stdout = STDOUT 
+0

Почему бы вам не инициализировать буфер вместо StringIO? – kch

+0

Когда я написал эту функцию gazillion несколько лет назад, я был зеленым и не знал о StringIO. Черт, тогда это был Ruby 1.6. Сегодня первый случай, когда я должен был смотреть на этот код с тех пор. Но независимо от того, использует ли код StringIO, это проблема с периферией. –

+1

Действительно, это периферийная проблема, а stringio - меньше кода, что помогает читаемости соответствующей части примера. Я собираюсь принять ваш ответ. Я отредактирую его, чтобы использовать stringio, не стесняйтесь возвращать его, если вам не нравятся мои изменения. – kch

0

Вы можете отправить часть своего результата в файл, а затем выгрузить ее обратно на консоль, когда закончите.

+0

Ухаживать за этим? – kch

+0

Какую часть написания файла вы не понимаете? –

+1

Посмотрите, где я пишу «практическое использование такой функции»? – kch

2

Книга Мацумото, по-видимому, дает ответ. Цитата из 9.7.1.4 Предопределенные потоки: «Глобальные функции, такие как print и puts, записываются в $ stdout по умолчанию. Если скрипт изменяет значение этой глобальной переменной, это изменит поведение этих методов».

Мне кажется, что идея состоит в том, чтобы просто разрешить простое решение, возможно, плохо реализованной программы.

+1

s/возможно, плохо реализованная программа/предположительно удаляющая скрипты unix/ – kch

+0

помните, что 'print' и' puts' на самом деле записываются в '$>', который изначально установлен в '$ stdout', но может быть изменен. Или я думаю. – kch

+0

Ах, sed юмор. Всегда веселый. –

1
$stderr = File.open 'error.log', 'w' 

Все ошибки будут записаны в error.log

+0

Hum. Имеет смысл, если у вас есть файл конфигурации, который определяет, что вы должны регистрироваться в файле вместо stderr. – kch

 Смежные вопросы

  • Нет связанных вопросов^_^