谁能告诉我为什么这个程序没有产生输出?它应该产生的输出是:行读取: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
答案 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
其余的就像魔术一样