2017-05-02 4 views
0
input_file = ARGV.first 

def print_all(f) 
    puts f.read 
end 

def rewind(f) 
    f.seek(0) 
end 

def print_a_line(line_count, f) 
    puts "#{line_count}, #{f.gets.chomp}" 
end 

current_file = open(input_file) 

puts "First let's print the whole file:¥n" 

print_all(current_file) 

puts "Let's rewind kind a like a tape" 

rewind(current_file) 

puts "Let's print three lines:" 

current_line = 1 
print_a_line(current_line, current_file) 

current_line += 1 
print_a_line(current_line, current_file) 

Ich bin sicher, es gibt eine ähnliche Post, aber meine Frage ist ein bisschen anders. Wie oben gesehen, hat die print_a_line-Methode zwei Parameter erhalten, die line_count und f sind.Ein gets.chomp als Argument übergeben

1) Wie ich verstanden habe, dient line_count Argument nur als eine Variable, die current_line ist und es ist nur eine ganze Zahl. Wie kommt es zu dem Rücklauf (f) Verfahren betreffen, denn wenn ich den Code ausführen, wobei das Verfahren print_a_line dies zeigt:

1, Hi 
2, I'm a noob 

wobei 1 die erste Zeile ist, und 2 ist die zweite. line_count ist nur eine Zahl, woher weiß Ruby, dass 1 die Zeile 1 und 2 die Zeile 2 ist?

2) Warum verwenden gets.chomp in Methode print_a_line? Wenn ich wie dies nur f passieren

def print_a_line(line_count, f) 
    puts "#{line_count}, #{f}" 
end 

Ich werde ein verrücktes Ergebnis erhalten, die

1, #<File:0x007fccef84c4c0> 
2, #<File:0x007fccef84c4c0> 

Antwort

0

Da IO#gets nächste Zeile lesbar I/O-Stream liest (in diesem Fall ist es eine Datei) und gibt beim Lesen String ein Objekt zurück und erreicht das Ende der Datei nicht. Und chomp entfernt Wagenrücklaufzeichen von String Objekt.

Also, wenn Sie eine Datei mit Inhalt haben wie:

This is file content. 
This file has multiple lines. 

Der Code wird gedruckt:

1, This is file content. 
2, This file has multiple lines. 

Im zweiten Fall, Sie vorbei Dateiobjekt selbst und lesen es nicht . Daher sehen Sie diese Objekte in der Ausgabe.

Verwandte Themen