3

Ruby に慣れ始めた私は、今までにない機能に出会いました -- callcc.
それが何のためにあるのかについての一般的な考えは理解しましたが、例を書き込もうとしたときに予期しない結果が得られました。

require 'continuation'
def callcc_func
  i = 0
  while true
    c = nil
    callcc {|x| c = x}
    i += 1
    puts i    
    return c if (i % 3) == 0
  end
end

c = callcc_func()
puts
callcc_func.call

結果は無限ループです。なんで?
私はそれが次のようになると予想しました:

# for `c = callcc_func()` line
1
2
3

# callcc_func.call
4
5
6
#end here because of `return c if (i % 3) == 0`

PS
私の英語で申し訳ありませんが、ありがとうございます。

4

2 に答える 2

1

call-with-current-continuation(一般に、Scheme に由来するものとして省略されるcall/ccため、それについて詳しく知りたい場合は、Scheme のドキュメントが出発点として適しています。

Ruby の問題については、このブログ記事のタイトルContinuations and ruby​​ を見てください。これは、あなたがしようとしていることと非常によく似たものを実装しています。そこに説明があります:

メインの Ruby インタープリターによって実行されるスクリプト ファイルとして、これはプログラムが呼び出されたときと場所でプログラムの制御状態をキャプチャするため、永久にループします。これには、継続を返し、再度呼び出すことも含まれます。

于 2012-05-16T10:04:44.770 に答える