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

最初の 5 行を完全に削除できます。

つるはしから

$<: コマンドライン引数または $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 オブジェクトを返します。これは、コマンド ラインで $< がファイルを読み取るときに変更される場合があります。[r/o]

したがって:

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 に答える