Ruby:跳过gets的值

4
我有一个文件检查和排序脚本。现在我希望用户能够选择最终输出的排序方式。不幸的是,Ruby似乎忽略了gets命令。如果我注释掉整个部分,脚本就可以正常完成。请忽略def readout。我从未完成它...。
所以我的问题是:为什么Ruby跳过gets命令?
class Product
  attr_reader :id, :name, :price, :stock
  def initialize(id,name,price,stock)
    @id = id
    @name=name
    @price=price
    @stock=stock
  end
  def readout
    self.each do |product|
      print product.id
      print "|"
      print product.name
      print "|"
      print product.price
      print "|"
      print product.stock
      puts ""
    end
  end
end

products = []
newproducts= []

if ARGV[0] != nil
  if File.exist?(ARGV[0])
    File.open(ARGV[0] , "r") do |f|
      f.each_line do |line|
        products << line
      end
    end
    products.each do |product|
      data = product.split(",")
      newproducts.push(Product.new(data[0].strip, data[1].strip, data[2].strip.to_i, data[3].strip.to_i))
    end

    puts "What to sort by?"
    question = gets.strip
    if question == "name"
      newproducts.sort! {|a,b| b.name <=> a.name}
    elsif question == "price"
      newproducts.sort! {|a,b| b.price <=> a.price}
    elsif question =="id"
      newproducts.sort! {|a,b| b.id <=> a.id}
    elsif question == "stock"
      newproducts.sort! {|a,b| b.stock <=> a.stock}
    else
      puts "Wrong Answer."
    end

    #End of File Check
  else
    puts "File #{ARGV[0]} does not exist."
  end

  if ARGV[1] != nil
    File.open(ARGV[1], "w") do |f|
      newproducts.each do |product|
        puts "Added #{product.name} to the file."
        data = {product.id, product.name, product.price, product.stock}
        f.puts(data)
      end
    end
    #End of ARGV check.
  else
    puts "No output file assigned."
  end

  #End of master ARGV check.
else
  puts "No command given."
end

1
未来的编程:通常情况下,将你的非工作代码缩减为尽可能短的示例,但仍然能够展示与原始代码相同的错误是一个好主意。这大大增加了其他人及时发现错误的机会和意愿。 - sepp2k
1
当你认为语言中的核心例程没有正常工作时,而这种语言已经存在一段时间了,那么问题很可能不在核心例程中,而是在你的代码中。此时,最好的做法是退后一步,仔细阅读文档,不看代码,然后在30分钟后再次查看代码。有时候问题会突然显现。我的同事曾告诉我他们在C的输入例程中发现了错误,并且亲口发誓这是编译器的问题。果然,问题出在他们的代码中。 :-) - the Tin Man
我本来以为这个问题是出在我的代码上面。到现在我还是不确定哪里能找到一个好的学习Ruby的指南。我已经思考这段代码很长时间了,也问了我的同学们,但是没有人能给出回答为什么代码无法响应的原因。一些人建议可能是因为OSX上的NetBeans。非常感谢你的帮助。@sepp2k:我不确定多少东西可以被简化,我不确定我的文件检查是否会有干扰。 - Fallion
好的指南有很多书可以选择,无论是在线还是购买。个人而言,我会购买想要完整阅读的纸质版,以及想要作为参考或快速搜索的电子书版本。请查看亚马逊Programming RubyRuby doc - the Tin Man
此外,Stack Overflow 上有许多关于 Ruby 书籍的问题。链接 - the Tin Man
显示剩余3条评论
1个回答

6
< p > Kernel # gets 方法从 ARGF 而不是 $stdin 读取。这意味着如果给出了命令行参数(更准确地说,如果 ARGV 不为空),则它将从ARGV中的文件中读取。否则只从标准输入读取。

要始终从stdin读取,请改用$stdin.gets而不是gets


非常感谢。现在可以工作了。我不知道 Ruby 是如何处理 ARGV 和 stdin 的。 - Fallion
@Fallion:大多数人在受到影响之前并不会意识到这一点。这可能是最常见的 Ruby 陷阱之一。 - sepp2k

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接