如果没有arg,则运行stdin的脚本; 否则输入文件= ARGV

这很好用 – 只是想知道是否有任何改进来缩短它?

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(在没有参数的情况下)给出的所有文件内容的连接的访问​​。 $ <支持类似于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对象。 这可能会随着$ <读取命令行中的文件而改变。 [R / O]

因此:

 print $<.read 

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

 while s = gets puts s end 

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

 input = ARGV ? $< : File.new(ARGV[0]) 

then ; 是可选的

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

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