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出来
答案 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