似乎无法将我的数据读取为整数并打印出数据,而是获得了第二个选项,即错误:文件的第一行不是数字。
def write(aFile, number)
aFile.puts(number)
index = 0
while (index < number)
aFile.puts(index)
index += 1
end
end
def read(aFile)
count = aFile.gets
if (is_numeric?(count))
count = count.to_i
else
count = 0
puts "Error: first line of file is not a number"
end
index = 0
while (count < index)
line = aFile.gets
puts "Line read: " + line
index += 1
end
end
def main
aFile = File.new("mydata.txt", "w") # open for writing
if aFile # if nil this test will be false
write(aFile, 10)
aFile.close
aFile = File.new("mydata.txt", "r")
read(aFile)
aFile.close
else
puts "Unable to open file to write or read!"
end
end
def is_numeric?(obj)
if /[^0-9]/.match(obj) == nil
true
end
false
end
main
任何有关解决此问题的帮助都将非常有用。
答案 0 :(得分:0)
您的问题是缺少return
def is_numeric?(obj)
if /[^0-9]/.match(obj) == nil
true
end
false
end
此函数始终返回false。它永远不会返回true。 Ruby函数始终在显式return()
处返回,如果没有调用,则返回最后一行。这意味着您在那里的true
不会执行任何操作。只需将其丢弃并返回false
。
此现有功能的简化形式是:
def is_numeric?(obj)
false
end
要解决此问题,您需要在return
为真时>
def is_numeric?(obj)
if /[^0-9]/.match(obj) == nil
return(true)
end
false
end
您还可以将其简化为:
def is_numeric?(obj)
/[^0-9]/.match(obj).nil?
end
另外,如果您使用的是Ruby 2.4+,则更有效的方法是使用match?方法和一个否定符。 match
设置了一些方便的MatchData(和反向引用),但是由于您不需要任何这些内容,因此可以使用match?
来节省开销,该方法只返回一个布尔值。
def is_numeric?(obj)
!/[^0-9]/.match?(obj)
end
另一个问题是您的count < index
逻辑。
while (count < index)
line = aFile.gets
puts "Line read: " + line
index += 1
end
由于index
为0,因此唯一一次count
小于index
的情况是计数是否小于0。也许您是说while (count > index)
?
注意:
https://www.ruby-lang.org/en/news/2016/12/25/ruby-2-4-0-released/