7

这很好用——只是想知道是否有任何改进可以缩短它?

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
4

3 回答 3

18

您可以完全消除前五行。

从镐

$<:提供对作为命令行参数或 $stdin(在没有参数的情况下)给出的所有文件内容串联的访问的对象。$< 支持类似于 File 对象的方法:binmode, close, closed?, each, each_byte, each_line, eof, eof?, file, filename, fileno, getc, gets, lineno, lineno=, path, pos, pos=, read、readchar、readline、readlines、rewind、seek、skip、tell、to_a、to_i、to_io、to_s,以及 Enumerable 中的方法。方法 file 返回当前正在读取的文件的 File 对象。这可能会随着 $< 读取命令行上的文件而改变。[转/转]

所以:

print $<.read

Kernel.gets 是 $<.gets 的简写,所以:

while s = gets
  puts s
end
于 2010-01-06T15:13:30.590 回答
3

ARGV ?适用于我,"r"通常默认,因此可以跳过它,并且File.new()可能与 相同File(),所以

input = ARGV ? $< : File.new(ARGV[0])
于 2010-01-06T14:17:12.403 回答
2

then并且;是可选的

您也可以使用三元运算符:

input = ARGV[0].nil? ? $< : File.new(ARGV[0],"r")
于 2010-01-06T14:10:43.553 回答