传递gets.chomp作为参数

时间:2017-05-02 06:34:58

标签: ruby arguments seek

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方法有两个params,即line_count和f。

1)据我所知,line_count参数仅用作current_line的变量,它只是一个整数。它与rewind(f)方法有什么关系,因为当我运行代码时,print_a_line方法显示了这一点:

1, Hi
2, I'm a noob

其中1是第一行,2是第二行。 line_count只是一个数字,ruby如何知道1是第1行,2是第2行?

2)为什么在方法print_a_line中使用gets.chomp?如果我像这样传递

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

我会得到一个疯狂的结果

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

1 个答案:

答案 0 :(得分: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.

在第二种情况下,您正在传递文件对象而不是读取它。因此,您可以在输出中看到这些对象。