【问题标题】:Why does this recurring function fire twice per input?为什么这个循环函数每次输入都会触发两次?
【发布时间】:2014-03-08 23:57:30
【问题描述】:

执行时:

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 和 12 行等待用户输入 - 在收到输入后,它似乎在循环中运行了两次。

为什么会这样?


已解决:

显然,当以这种方式使用 IO.getn 时,会发生一些奇怪的事情——可能将“Y”读为一个字节,而将“enter”读为一个单独的字节。替换 IO.gets 并且没有字符数似乎可以解决问题。或者,隔离 getn 方法调用可能会阻止此问题发生。

【问题讨论】:

    标签: recursion range elixir


    【解决方案1】:

    你是对的。在终端中,IO.getn/1 仅在您输入新行后返回字节,这意味着如果您以递归方式逐字节读取,您将收到两个字节,一个用于用户命令,另一个用于新行。 IO.gets/1 是这里的路。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      相关资源
      最近更新 更多