Это работает вполне приятно - просто задался вопросом, существуют ли какие-либо улучшения для сокращения его?
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
] Первые пять строк можно исключить полностью.[
] []С Pickaxe[
] [] [] []$<: Объект, обеспечивающий доступ к конкатенация содержания все файлы, заданные в командной строке аргументы или $stdin (в случае, если нет никаких аргументов). $<поддерживает методы, похожие на объект "Файл": бинмод, закрыть, закрыть? Каждый, each_byte, each_line, eof, eof?, файл, Филено, Филено, Гетс, Гетс, Линено, lineno=, path, pos, pos=, read, readchar, readline, readline, rewind, искать, пропускать, говорить, к_а, к_и, к_йо, to_s, наряду с методами в Неисчислимо. Файл метода возвращает Файловый объект для файла в настоящее время читают. Это может измениться на $< просматривает файлы по команде Линия. [r/o][
] [
] Поэтому:[
] [print $<.read
]
[]Kernel.gets - сокращение от $<.gets, поэтому:[
] [while s = gets
puts s
end
] ] Только [] ARGV ?[
] работает на меня, [] "r"[
] обычно по умолчанию, поэтому может пропустить его, и [] Файл. new()[
] может быть таким же как []File()[
], так что[
input = ARGV ? $< : File.new(ARGV[0])
] затем
и ;
опционально
также можно использовать тернарный оператор:
input = ARGV[0].nil? ? $< : File.new(ARGV[0],"r")