我有一个方法
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
关键字?
答案 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()
。success
和is_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!