重构我的代码,使文件关闭自动加载一次,请问语法工作?

时间:2019-02-01 10:44:28

标签: ruby file methods syntax

我的程序从文件中加载列表,我试图更改该方法,以便它自动关闭。

我看过Ruby文档the broad stackoverflow answerthis guy's website,但是语法总是不同的,对我来说还没有太大意义。

我的原始负载:

def load_students(filename = "students.csv")
  if filename == nil
    filename = "students.csv"
  elsif filename == ''
    filename = "students.csv"
  end
  file = File.open(filename, "r")
  file.readlines.each do |line|
    name, cohort = line.chomp.split(",")
    add_students(name).to_s
  end
  file.close
  puts "List loaded from #{filename}."
end

我试图自动关闭:

def load_students(filename = "students.csv")
  if filename == nil
    filename = "students.csv"
  elsif filename == ''
    filename = "students.csv"
  end
  open(filename, "r", &block)
  line.each do |line|
    name, cohort = line.chomp.split(",")
    add_students(name).to_s
  end
  puts "List loaded from #{filename}."
end

我正在寻找相同的结果,但无需手动关闭该文件。

我认为这不会有太大的不同,那么自动关闭块的语法如何工作?

1 个答案:

答案 0 :(得分:2)

File.open(filename, 'r') do |file|
  file.readlines.each do |line|
    name, cohort = line.chomp.split(",")
    add_students(name).to_s
  end
end

我将重构整个代码:

def load_students(filename = "students.csv")
  filename = "students.csv" if filename.to_s.empty?
  File.open(filename, "r") do |file|
    file.readlines.each do |line|
      add_students(line.chomp.split(",").first)
    end
  end
  puts "List loaded from #{filename}."
end

或者,甚至更好的是,如Kimmo Lehto在评论中建议的那样:

def load_students(filename = "students.csv")
  filename = "students.csv" if filename.to_s.empty?
  File.foreach(filename) do |line|
    add_students(line.chomp.split(",").first)
  end
  puts "List loaded from #{filename}."
end