2010-11-25 9 views
4

私はファイルチェックとソートスクリプトを持っています。今では、ユーザーが最終出力をソートする方法を選択することを希望しました。悲しいことに、Rubyはgetsコマンドを無視しているようだ。私がセクション全体をコメントアウトすると、スクリプトは正常終了します。 def readoutを無視してください。私は決してそれを終えたことはありません....Ruby:取得値をスキップします

私の質問は次のとおりです。なぜ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の入力ルーチンのバグが見つかったと教えてもらう前に、それがコンパイラにあったことを誓い、確かに、それは彼らのコードでした。 :-) –

+0

私はそれが私のコードにあると思った。私はまだどこでルビーを学ぶための良いガイドを見つけるか分からない。私は年齢のためにこのコードを検討していて、クラスメートにも尋ねました。なぜそれが応答していないのかについて、誰も答えを出すことはできませんでした。 NetBeans on OSXの可能性がある人もいます。 ありがとうございました。 @ sepp2k:どのくらいの量が削減されたのか分かりませんが、私のファイルチェックが何らかの形で妨害されているかどうかはわかりませんでした。 – Fallion

答えて

6

Kernel#gets方法はARGFない$stdinから読み込みます。これは、コマンドライン引数が与えられた場合(またはより正確にはARGVが空でない場合)、ARGVのファイルから読み込むことを意味します。それ以外はstdinから読み込みます。

常にstdinから読み取るには、getsの代わりに$stdin.getsを使用してください。

+0

ありがとうございました。それは今働く。私はそれがRubyがARGV vs stdinを処理した方法を知らなかった。 – Fallion

+0

@ Fallion:ほとんどの人は、それが噛むまでそれをしない。これはおそらく最も一般的なルビの落とし穴の1つです。 – sepp2k

関連する問題