应该说在不改变返回值的前提下,方法的作者给方法的使用者抛出这个方法中的一些字段的值,具体的字段在 yield 后定义。 这里 test(your_proc) 抛出 user_ids,后面 block 中 do|users_ids|来获取 users_ids, 方法 test(your_proc) 的最后结果 true 不变。
def test(your_proc)
user_ids = User.where("name like '%z%'").pluck(:id)
User.where(id: user_ids).find_each{|x| x.update_columns(name: "name_#{x.id}")}
your_proc.call()
yield :x, user_ids if block_given?
yield :y, [] if block_given?
puts 'done'
true
end
test(Proc.new{ puts 'this is proc' })
test(lambda{ puts 'this is lambda' })
result = test(->{ puts 'this is ->' }) do |operate, user_ids|
if operate == :x
Rails.logger.debug "user_ids: #{user_ids}"
end
if operate == :y
end
puts 'this is block'
end
if result
302
else
500
end