Rails控制器变量中的Ruby Yield

时间:2017-04-24 10:37:22

标签: ruby-on-rails ruby yield

我正在尝试了解以下rails控制器的方法

def self.collect_with_max_id(collection=[], max_id=nil, &block)
        response = yield(max_id)
        collection += response
        response.empty? ? collection.flatten : collect_with_max_id(collection, response.last.id - 1, &block)
    end

当尝试使用byebug调试方法时,我获取所有对象集合和max_id的值: 我被困在这部分

response = yield(max_id)

虽然max_id为552860227390144512,但在调用响应变量时,我只是得到一个空数组[],它似乎打破了整个方法。

有人可以在此上下文中解释yield函数。我现在只能在ror中渲染视图和块。

1 个答案:

答案 0 :(得分:0)

yield是ruby中的关键字,用于执行给予方法的块。

def foo
  yield 'Hi 1'
  yield 'Hi 2'
end

foo { |string| puts string }

# Hi 1
# Hi 2

在你的情况下,块也被带入变量&block,所以你可以做一个递归:

def bar(i = 1,  &block)
  return if i <= 0

  yield(i) # or you can do block.call(i)

  bar(i - 1, &block)
end

bar(3) { |i| puts "I am called with #{i}" }

该方法因最后一行而停止递归。您询问response.empty?是否以及是否返回collection.flatten

tl&amp; dr在几个月内忘记了rails并学习了ruby语言,否则你将会处于一个受伤的世界。