为什么我的Ruby代码没有处理输入?

时间:2015-04-27 16:32:51

标签: ruby windows-7-x64

STDIN.read.split("\n").each do |a|
a=gets.to_i
if a >=0
 puts "a is positive"

end
end

输出

C:\Ruby221-x64\programs>ruby test2.rb
5
test2.rb:3:in `read': Interrupt
    from test2.rb:3:in `<main>'

问题:为什么我的Ruby代码不会进入if?

上述代码是否也是处理连续输入的方法?我的代码将如何知道停止哪个输入。我不得不按Ctrl-C出来

3 个答案:

答案 0 :(得分:3)

您的gets来电是多余的,因为STDIN.read.split("\n").each do |a|已经将输入读入a。因此请删除gets

STDIN.read.split("\n").each do |a|
  if a.to_i >= 0
    puts "#{a} is positive"
  end
end

请注意,I / O已缓存,并且您以块为单位进行操作,因此您将获得:

输入以下输入:

5
4
3

按Ctrl-D结束输入(对于Linux)或Ctrl-Z(对于Windows),然后您将获得结果:

5 is positive
4 is positive
3 is positive

 => ["5", "4", "3"]

如果您希望这更具互动性,请不要使用STDIN... each构造,而只需使用gets.to_i进行循环。例如:

loop do
  a = gets
  break if a.nil?    # Exit loop on EOF (ctrl-D)

  if a.to_i > 0
    puts "a is positive"
  end
end

如果我把它放到一个文件中,说foo.rb,那么我得到:

OS_Prompt> ruby foo.rb
3
a is positive
5
a is positive
2
a is positive
-1
-3
2
a is positive
[ctrl-D]
OS_Prompt> 

它将退出ctrl-D上的循环,因为这会导致gets返回nil。虽然在Windows中,它可能需要Ctrl-Z。

答案 1 :(得分:0)

▶ loop do
▷   b = STDIN.gets.to_i
▷   break if b.zero?
▷   puts b > 0 ? 'positive' : 'negative'
▷ end
#⇒ 5
# positive
# -4
# negative
# 0
# => nil

答案 2 :(得分:0)

laravel

这条线已经在不断地输入,然后是需要获得的。

STDIN.read.split("\n").each do |a|

此处chomp用于从输入中删除while(true) b= gets.chomp.to_i puts b >=0 ? "b is positive" : "b is negative" end