file.each_line只能调用一次

Kri*_*lsh 3 ruby iteration

我在迭代文件的行时遇到一些问题,似乎每个文件只能使用一次each_line方法

file = open_file(path)
file.each_line { puts "Q"}
puts "--"
file.each_line { puts "Q"}
puts "--"
file.each_line { puts "Q"}
puts "--"
file.each_line { puts "Q"}

#Output: (on a file with three lines in it )
#Q
#Q
#Q
#--
#--
#--
Run Code Online (Sandbox Code Playgroud)

它与常规迭代器一起工作正常

3.times { puts "Q"}
puts "--"
3.times { puts "Q"}
puts "--"
3.times { puts "Q"}
puts "--"
3.times { puts "Q"}

#Output: (on a file with three lines in it )
#Q
#Q
#Q
#--
#Q
#Q
#Q
#--
#Q
#Q
#Q
#--
#Q
#Q
#Q
Run Code Online (Sandbox Code Playgroud)

有什么我想念的吗?

Tha*_*you 6

您必须使用文件#seek重置文件的读取位置

试试这个

file.each_line &method(:puts)
file.seek 0
file.each_line &method(:puts)
Run Code Online (Sandbox Code Playgroud)

根据评论,以下内容也适用

file.each_line &method(:puts)
file.rewind
file.each_line &method(:puts)
Run Code Online (Sandbox Code Playgroud)

Dummie的内容

# users.json
[
  {"name": "bob"},
  {"name": "alice"}
]
Run Code Online (Sandbox Code Playgroud)

红宝石

# output.rb
file = File.open("users.json")
file.each_line &method(:puts)

#=> [
#=>   {"name": "bob"},
#=>   {"name": "alice"}
#=> ]

file.seek 0
#=> 0

file.each_line &method(:puts)
#=> [
#=>   {"name": "bob"},
#=>   {"name": "alice"}
#=> ]
Run Code Online (Sandbox Code Playgroud)