1

方法があります

def method1(&block)
  #.............
  if condition == "yes"
    yield if block_given?
    {success: :true, value: **value returned from the block**}
  else        
    {is_success: :false, value: get_errors_array() }
  end
end

から値を取得するにはどうすればよい&blockですか? そのためにキーワードを&block使用する必要がありますか?return

4

4 に答える 4

6

returnいいえ、ブロック内に aがあってはなりません。ブロックの「戻り値」は、ブロック内の最後の式の値です。

value_returned = yield if block_given?

于 2013-01-06T08:35:06.687 に答える
3
def method1
  fail("Needs block") unless block_given?
  if condition
    {success: true, value: yield}
  else        
    {success: false, value: get_errors_array}
  end
end

注意事項と質問:

  • 使用する場合は、メソッドの引数yieldに入れるのが慣用的ではありません。&blockブロック書き込みを要求する場合fail("Need blocks") unless block_given?。省略しても「LocalJumpError: no block given」が表示されますが、これも問題ありません。
  • yieldステートメントではなく式です。
  • と書くのは慣用的ではありませんmethod()
  • ブロックが指定されていない場合に使用するデフォルト値が必要です (もちろん、以前に失敗した場合を除きます)。
  • 別のキーsuccessを使用しましis_successたが、なぜですか?
  • :true実際のブール値の代わりにandを使用し:falseたのはなぜですか?
于 2013-01-06T10:02:48.960 に答える
2

を使用しcallます。

block.call

引数を取る場合blockは、引数を与えます:

block.call(whatever_arguments)
于 2013-01-06T08:30:11.673 に答える
-1

& プレフィックス演算子を使用すると、メソッドは渡されたブロックを名前付きパラメーターとしてキャプチャできます。

def wrap &b
     print "dog barks: "
     3.times(&b)
     print "\t"
end
wrap { print "Wow! " }  # Wow!  Wow!  wow!
于 2013-01-06T11:26:33.723 に答える