1

実行時:

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 行目でユーザー入力を待機しませんでした。入力を受け取った後、ループを 2 回実行しているように見えます。

それはなぜでしょうか?


解決済み:

どうやら、このように使用すると IO.getn で奇妙なことが起こります。おそらく、「Y」をバイトとして読み取り、「enter」を別のバイトとして読み取ります。IO.gets を置き換えて文字数をカウントしないと、問題が解決するようです。または、getn メソッド呼び出しを分離することで、この問題が発生しないようにすることができます。

4

1 に答える 1

4

あなたは正しいです。端末ではIO.getn/1、新しい行を入力した後にのみバイトが返されます。つまり、1 バイトごとに再帰的に読み取る場合、1 つはユーザー コマンド用、もう 1 つは新しい行用の 2 バイトを受け取ります。IO.gets/1ここに行く方法です。

于 2014-03-07T13:05:10.183 に答える