1

Programming with Ruby 2.0 を読んでいるのですが、質問があります

   def my_while(cond, &body)
     while cond.call
       body.call
     end
   end

   a=0

   my_while -> { a < 3 } do
     print a
     a += 1
   end #=> 0 1 2

問題は、なぜこの方法を使用できないのかということです

    def my_while(cond, &block)
      while cond
       block.call
      end   
    end

    a = 0
    my_while (a<3) do
      print a
      a += 1
    end #=> infinite loop

そして、実際にこの関数を条件 (a<3) とブロック パラメーターで使用する方法は?

PS私はこの質問を見ましたが、まだそこにコメントして質問することはできません!

4

1 に答える 1

1

最後のコード サンプルでa<3は、​​行の呼び出しmy_whileが実行されるときに評価されます。

前の行で にa設定されたように、 true と評価されます (0 は 3 未満です)。これは、内部が に設定されていることを意味します。変更されても、再評価されないため、そのままです。したがって、ループはループし続けます。0a<3my_whilecondtruetruea<3awhile

ラムダを使用し.call、ループのすべての反復でそれを ing することで、ループごとに条件が評価され、 が に評価されなくなっa<3たときに while ループを停止できるようになります。a<3true

于 2013-09-10T13:24:12.100 に答える