Скрипт для запуска с stdin, если нет аргументов; в противном случае входной файл = ARGV [0] - PullRequest
7 голосов
/ 06 января 2010

Это работает довольно хорошо - просто интересно, есть ли какие-либо улучшения, чтобы сократить его?

if (ARGV[0].nil?) then
    input=$<
else
    input=File.new(ARGV[0],"r");
end

...
# Do something with the input here, for example:
input.each_line do |line|
    puts line
end

Ответы [ 3 ]

18 голосов
/ 06 января 2010

Вы можете полностью исключить первые пять строк.

из кирки

$ <: объект, обеспечивающий доступ к объединение содержимого все файлы приведены в командной строке аргументы или $ stdin (в случае, когда нет аргументов). $ <поддерживает методы, аналогичные объекту File: binmode, закрыть, закрыть ?, каждый, each_byte, each_line, eof, eof ?, файл, имя файла, fileno, getc, получает, белья, белье =, путь, pos, pos =, читать, readchar, readline, readlines, перемотка назад, искать, пропускать, говорить, to_a, to_i, to_io, to_s, наряду с методами в Перечислимых. Файл метода возвращает Файловый объект для файла в настоящее время будучи прочитанным Это может измениться как $ < читает файлы по команде линия. [Г / о] </p>

Таким образом:

print $<.read

Kernel.gets - это сокращение от $ <. Gets, поэтому: </p>

while s = gets
  puts s
end
3 голосов
/ 06 января 2010

Только ARGV ? работает для меня, "r" обычно по умолчанию, поэтому может пропустить его, и File.new() может быть таким же, как File(), поэтому

input = ARGV ? $< : File.new(ARGV[0])
2 голосов
/ 06 января 2010

then и ; необязательны

, также вы можете использовать троичный оператор:

input = ARGV[0].nil? ? $< : File.new(ARGV[0],"r")
...