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
对于未来:将非工作代码缩减为尽可能短的示例通常是一个好主意,但是在运行时仍会显示与原始代码相同的错误。这大大增加了某人能够(或愿意)及时发现错误的机会。 – sepp2k 2010-11-25 17:29:57
另外,当你认为某种语言的核心例程工作不正常,并且该语言已经存在一段时间时,可能性非常高,这个问题不在核心例程中,而是存在于代码中。在这一点上,退一步,仔细阅读文档而不看代码是一个好主意,然后在30分钟后再次查看代码。有时候问题会跳出来。我曾经有过同事告诉我,他们之前在C的输入例程中发现了错误,在编译器中发生错误。果然,这是他们的代码。 :-) – 2010-11-25 17:39:30