2017-05-02 2 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) 

Je suis sûr qu'il y a un post un peu similaire à ceci, mais ma question est un peu différente. Comme vu ci-dessus, la méthode print_a_line a deux paramètres qui sont line_count et f.Passer un gets.chomp comme argument

1) Comme je l'ai compris, l'argument line_count ne sert que de variable current_line et c'est juste un entier. Quel est le rapport de la rewind (f) Méthode parce que quand j'exécuter le code, le procédé print_a_line montre ceci:

1, Hi 
2, I'm a noob 

où 1 est la première ligne et la figure 2 est la seconde. line_count est juste un nombre, comment ruby ​​sait que 1 est la ligne 1 et 2 est la ligne 2?

2) Pourquoi utiliser gets.chomp dans la méthode print_a_line? Si je passe juste f comme celui-ci

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

Je vais obtenir un résultat fou qui est

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

Répondre

0

Parce que IO#gets lit la ligne suivante du flux E/S lisible (dans ce cas, il est un fichier) et renvoie un objet String lors de la lecture avec succès et n'a pas atteint la fin du fichier. Et, chomp supprime les caractères de retour chariot de l'objet String.

Ainsi, lorsque vous avez un fichier avec des contenus tels que:

This is file content. 
This file has multiple lines. 

Le code imprimera:

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

Dans le second cas, vous passez l'objet fichier lui-même et non le lire . D'où vous voyez ces objets en sortie.