【问题标题】:Ruby Yield in Rails Controllers variableRails 控制器变量中的 Ruby Yield
【发布时间】:2017-09-21 00:05:40
【问题描述】:

我正在尝试了解 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,但在调用响应变量时,我只是得到一个空数组 [],它似乎破坏了整个方法。

有人可以在这种情况下解释收益率函数吗?我现在才从 ror 中渲染视图和块。

【问题讨论】:

    标签: ruby-on-rails ruby yield


    【解决方案1】:

    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&dr 是几个月忘记 Rails 并学习 ruby​​ 语言,否则你将陷入痛苦的世界。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-11
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多