从Ruby块返回值

时间:2013-01-06 08:25:41

标签: ruby

我有一个方法

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 个答案:

答案 0 :(得分:4)

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

value_returned = yield if block_given?

答案 1 :(得分: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()
  • 并不是惯用语
  • 当没有给出阻止时,你需要一个默认值(当然,除非你之前失败)。
  • 您使用了不同的密钥successis_success,为什么?
  • 您使用:true:false代替真正的布尔值,为什么?

答案 2 :(得分:2)

使用call

block.call

如果block接受参数,则给出参数:

block.call(whatever_arguments)

答案 3 :(得分:-1)

&前缀运算符将允许方法捕获传递的块作为 命名参数。

def wrap &b
     print "dog barks: "
     3.times(&b)
     print "\t"
end
wrap { print "Wow! " }  # Wow!  Wow!  wow!