读写Ruby

时间:2019-05-24 21:09:16

标签: ruby

似乎无法将我的数据读取为整数并打印出数据,而是获得了第二个选项,即错误:文件的第一行不是数字。

    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

任何有关解决此问题的帮助都将非常有用。

1 个答案:

答案 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/