2

このコードをこのように実行したい

count = Hash.new(0)

while line = gets
  words = line.split
  words.each do |word|
    count[word] += 1
  end
end

count.sort{|a, b|
  a[1] <=> b[1]
}.each do |key, value|
  print "#{key}: #{value}\n"
end

しかし、私は壊れる方法がわかりません。そしてヒッティングCommandCリターン

word_count.rb:3:in `gets': Interrupt
from word_count.rb:3:in `gets'
from word_count.rb:3:in `<main>'

このコードを修正するにはどうすればよいですか?

4

3 に答える 3

3

プロセスに送信されたシグナルCtrl+をトラップすることもできます。C

 count = Hash.new(0)
 trap("SIGINT") { 
   count.sort{|a, b|
     a[1] <=> b[1]
   }.each do |key, value|
     print "#{key}: #{value}\n"
   end
   exit!
 }
 while line = gets
   words = line.split
   words.each do |word|
     count[word] += 1
   end
 end

Ruby Signalのドキュメントへの参照

于 2012-12-06T09:52:29.920 に答える
1

Ctrl-を試してくださいD。これはあなたが必要とするものですか?

于 2012-12-06T09:39:07.833 に答える
0
count = Hash.new(0)

stop_condition = "\n"
until stop_condition == line = gets
  words = line.split
  words.each do |word|
    count[word] += 1
  end
end

もちろん、break if line.chomp.empty?whileループの内側を使用することもできますが、実際には、脱出したい条件がわかっている無限ループであるため、これは避けます。これもプログラムを終了するのではなく、ループだけを終了します。

controlcそしてcontroldユーザーにとっては奇妙であり、私はそれらを例外的でないイベントに使用する必要を避けます。

于 2012-12-06T10:09:05.230 に答える