没有输出

时间:2020-06-07 19:21:51

标签: ruby

谁能告诉我为什么这个程序没有产生输出?它应该产生的输出是:行读取:0 行读取:1行读取:2行读取:3,依此类推。 到目前为止,即使我已修复了许多错误,也没有得到输出。任何帮助或建议,将不胜感激。


# takes a number and writes that number to a file then on each line
# increments from zero to the number passed
def write(aFile, number)
  # You might need to fix this next line:
  aFile.puts(number)
  index = 0
  while (index < number)
   aFile.puts(index.to_s)
   index += 1
  end
end

# Read the data from the file and print out each line
def read(aFile)

  # Defensive programming:
  count = aFile.gets
  if (is_numeric?(count))
    count = count.to_i

    index = 0
  while (index < count)
    line = aFile.gets
    puts "line read: " + line
    index+=1
  end
end
end

# Write data to a file then read it in and print it out
def main
  aFile = File.new("mydata.txt", "w") # open for writing
  write(aFile, 10)
  aFile.close


  aFile = File.new("mydata.txt", "r")
  read(aFile)

  aFile.close
end

# returns true if a string contains only digits
def is_numeric?(obj)
  if /[^0-9]/.match(obj) == nil
    true
  end
  false
end

main

2 个答案:

答案 0 :(得分:1)

您的代码不是用Ruby编写的。

如果我想紧密模仿您代码的逻辑,这就是我的写法:

# takes a number and writes that number to a file then on each line
# increments from zero to the number passed
def write_data(fname, counter)
  File.open(fname, 'w') do |fo|
    fo.puts(counter)
    counter.times do |n|
      fo.puts n
    end
  end
end

# returns true if a string contains only digits
def is_numeric?(obj)
  obj[/^\d+$/]
end

# Read the data from the file and print out each line
def read_data(fname)
  File.open(fname) do |fi|
    counter = fi.gets.chomp
    if is_numeric?(counter)
      counter.to_i.times do |n|
        line_in = fi.gets
        puts 'Line read: %s' % line_in
      end
    end
  end
end

# Write data to a file then read it in and print it out
DATA_FILE = 'mydata.txt'
write_data(DATA_FILE, 10)
read_data(DATA_FILE)

哪个输出:

Line read: 0
Line read: 1
Line read: 2
Line read: 3
Line read: 4
Line read: 5
Line read: 6
Line read: 7
Line read: 8
Line read: 9

请注意以下事项:

  • 方法(或变量)名称不在Ruby中的camelCase中,它们是snake_case。它的可读性。

  • Ruby鼓励我们在打开文件以进行读取或写入时使用块,以在完成文件后自动关闭文件。在长时间运行的程序中,使循环中的danging文件句柄处于打开状态,然后不关闭状态,是使程序崩溃的好方法,而这种方式很难弄清楚。这样做有很多问题。这来自IO#open文档:

    没有关联的块,::open::new的同义词。如果给出了可选代码块,它将作为参数传递io,并且在该代码块终止时IO对象将自动关闭。在这种情况下,::open返回块的值。

    通常,您会看到代码使用File.open而不是IO.open,这在Ruby编码器中通常是不习惯的。文件继承自IO,并向该类添加了一些其他的面向文件的方法,因此功能更加丰富。

  • Ruby有许多方法可以帮助我们避免使用while循环。弄错计数器或错过应该终止循环的条件在编程中太常见了,因此Ruby使循环“ n次”或遍历数组中的所有元素变得容易。 times方法很好地完成了这一任务。

  • 字符串的[]方法非常强大,可以轻松查看字符串的内容并应用模式或切片。使用/^\d+$/会检查整个字符串以确保所有字符都是数字,因此some_string[/^\d+$/]是比您正在做的事情更短的版本,并且完成相同的操作,返回一个“真实的”值。

  • 我们不使用main方法。那是老式的Pascal,C或Java,是人为构造的。 Ruby比这更友好。

代替使用

3.times do |n|
  puts n
end

# >> 0
# >> 1
# >> 2

我可能会使用

puts (0..(3 - 1)).to_a * "\n"

# >> 0
# >> 1
# >> 2

仅因为我倾向于用Perl来思考。这是另一个老习惯。

答案 1 :(得分:0)

我发现2个错误。修复这些错误将为您提供所需的输出。

错误#1。 您的方法is_numeric?始终返回false。即使您的病情是true。该方法的最后一行是false,因此整个方法总是返回false。 您可以分两步修复它。

步骤1:

 if /[^0-9]/.match(obj) == nil
    true
 else
    false
 end

在条件内返回布尔值不是一个好习惯。您可以通过以下方式简化它:

def is_numeric?(obj)
  /[^0-9]/.match(obj) == nil
end

甚至更好

def is_numeric?(obj)
  /[^0-9]/.match(obj).nil?
end

错误#2 在您的read方法内部。如果您从文件读取count的值后尝试输出"10\n"。末尾的\n会把你弄乱。

要在读取文件时摆脱\n,可以使用chomp。因此,您的阅读路线将是:

count = aFile.gets.chomp

其余的就像魔术​​一样