2010-11-25 46 views
4

我有一个文件检查和排序脚本。现在我希望用户能够选择他/她希望如何对最终输出进行排序。可悲的Ruby似乎忽略了gets命令。如果我将整个部分注释掉,那么脚本结束就好了。请忽略def读数。我从来没有完成那一个......所以我的问题是:为什么Ruby跳过gets命令。Ruby:跳过一个获取值

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 2010-11-25 17:29:57

+1

另外,当你认为某种语言的核心例程工作不正常,并且该语言已经存在一段时间时,可能性非常高,这个问题不在核心例程中,而是存在于代码中。在这一点上,退一步,仔细阅读文档而不看代码是一个好主意,然后在30分钟后再次查看代码。有时候问题会跳出来。我曾经有过同事告诉我,他们之前在C的输入例程中发现了错误,在编译器中发生错误。果然,这是他们的代码。 :-) – 2010-11-25 17:39:30

回答

6

Kernel#gets方法从ARGF$stdin读取。这意味着如果给出了命令行参数(或者如果ARGV非空,则更精确)它从ARGV中的文件中读取。否则它从标准输入读取。

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