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

我敢肯定有一個有點類似的帖子到這一點,但我的問題是有點不同。如上所示,print_a_line方法得到了兩個參數line_count和f。傳遞一個gets.chomp作爲參數

1)據我所知,line_count參數只作爲current_line變量,它只是一個整數。它是如何涉及倒帶(F)的方法,因爲當我運行該代碼,該方法print_a_line示出了該:

1, Hi 
2, I'm a noob 

其中1是第一行和圖2是第二個。 line_count只是一個數字,紅寶石如何知道1是1行而2是2行?

2)爲什麼在print_a_line方法中使用gets.chomp?如果我通過只是˚F這樣

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

我會得到一個瘋狂的結果是

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

回答

0

因爲IO#gets讀取讀取I/O流(在這種情況下,它是一個文件)和下一行成功讀取並且未到達文件結尾時返回String對象。並且,chompString對象中刪除回車符。

所以,當你有內容,如文件:

This is file content. 
This file has multiple lines. 

的代碼將打印:

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

在第二種情況下,你傳遞文件對象本身,而不是閱讀它。因此你可以在輸出中看到這些對象。