Jules
Jules

Reputation: 303

Refactoring my code so that file closes automatically once loaded, how does the syntax work?

My program loads a list from a file, and I'm trying to change the method so that it closes automatically.

I've looked at the Ruby documentation, the broad stackoverflow answer, and this guy's website, but the syntax is always different and doesn't mean much to me yet.

My original load:

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

My attempt to close automatically:

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

I'm looking for the same result, but without having to manually close the file.

I don't think it'll be much different, so how does the syntax work for automatically closing with blocks?

Upvotes: 1

Views: 69

Answers (1)

Aleksei Matiushkin
Aleksei Matiushkin

Reputation: 121000

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

I’d refactor the whole code:

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

Or, even better, as suggested by Kimmo Lehto in comments:

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

Upvotes: 2

Related Questions