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

不,这里不应该有一个returnin a block。块的“返回”值是其中最后一个表达式的值。

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方法参数。如果你想要求块 write fail("Need blocks") unless block_given?。你可以忽略它,然后你会得到一个“LocalJumpError: no block given”,这也没关系。
  • yield是一个表达式,而不是一个语句。
  • 写起来不习惯method()
  • 当没有给出块时,您需要使用默认值(当然,除非您之前失败)。
  • 您使用了不同的键successis_success为什么?
  • 您使用:trueand: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 回答