执行时:
def guess(a..b) do
IO.puts "In rn = #{a}..#{b}"
guess(a..b, IO.getn("Is it greater than #{div(a + b, 2)} ? : ", 1) |> String.upcase == "Y")
end
def guess(a..b, true) do
guess(div(a + b, 2)..b)
end
def guess(a..b, false) do
guess(a..div(a + b, 2))
end
结果:
iex(1)> Test.guess(1..10)
1 In rn = 1..10
2 Is it greater than 5 ? : y
3 In rn = 5..10
4 Is it greater than 7 ? :
5 In rn = 5..7
6 Is it greater than 6 ? : n
7 In rn = 5..6
8 Is it greater than 5 ? :
9 In rn = 5..5
10 Is it greater than 5 ? : y
11 In rn = 5..5
12 Is it greater than 5 ? :
13 In rn = 5..5
14 Is it greater than 5 ? :
iex没有等到第4,8和4行的用户输入。 12 - 收到输入后,它似乎两次循环。
为什么会这样?
解决:
显然,当以这种方式使用时,IO.getn会发生一些奇怪的事情 - 或许将“Y”作为字节读取,并将“输入”作为单独的字节。替换IO.gets并且没有字符数似乎可以解决问题。或者,隔离getn方法调用可能会阻止此问题的发生。
答案 0 :(得分:4)
你是对的。在终端中,IO.getn/1
仅在您输入新行后返回字节,这意味着如果您以递归方式读取每个字节的字节数,则将接收两个字节,一个用于用户命令,另一个用于新线。 IO.gets/1
是前往这里的方式。