首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >回忆多行方法- Rails

回忆多行方法- Rails
EN

Stack Overflow用户
提问于 2018-04-16 03:12:48
回答 4查看 1.9K关注 0票数 1

在使用rails之前,我从来没有实现过回忆录,我想我为它找到了一个很好的用例,但我不知道如何实现它。下面是我正在做的工作:

方法:

代码语言:javascript
复制
 def manager_rep_code_and_name
    manager = []

    rep_code_list.each do |rep_code|
      context = Finfolio::GetManagerByRepCode.call(rep_code: rep_code)

      manager.push({name: context.manager.response.first["Name"], rep_code: rep_code})
    end

    manager
  end

此方法进行网络调用,可能需要一段时间才能解决所有这些问题。有没有办法可以memoize这个方法,所以如果它已经存在,我就不用再发出这个请求了。

就像这样:

代码语言:javascript
复制
def manager_rep_code_and_name
   @managers ||= manager = []

   rep_code_list.each do |rep_code|
     context = Finfolio::GetManagerByRepCode.call(rep_code: rep_code)

     manager.push({name: context.manager.response.first["Name"], rep_code: rep_code})
   end

  manager
end

显然,这不起作用,但我现在有点卡住了。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-04-16 07:19:19

我经常把这类方法分开:

代码语言:javascript
复制
def fetch_manager_rep_code_and_name
  rep_code_list.map do |rep_code|
    context = Finfolio::GetManagerByRepCode.call(rep_code: rep_code)
    { name: context.manager.response.first['Name'], rep_code: rep_code }
  end
end

def manager_rep_code_and_name
  @manager_rep_code_and_name ||= fetch_manager_rep_code_and_name
end

通常,这也使它们更易于测试。

票数 7
EN

Stack Overflow用户

发布于 2020-12-11 14:27:51

可以使用begin end块回溯多行代码的结果:

代码语言:javascript
复制
def manager_rep_code_and_name
   @manager_rep_code_and_name ||= begin
     manager = []

     rep_code_list.each do |rep_code|
       context = Finfolio::GetManagerByRepCode.call(rep_code: rep_code)

       manager.push({name: context.manager.response.first["Name"], rep_code: rep_code})
     end

    manager
  end
end
票数 4
EN

Stack Overflow用户

发布于 2018-04-16 03:22:51

如果您想要为相同的函数单独记录输入/输出对,那么记忆化就会稍微复杂一些。由于这里没有输入,每次输出都是预期的或允许相同的,所以回忆录非常简单。就像这样:

代码语言:javascript
复制
  def manager_rep_code_and_name
    return @manager if @manager
    @manager = []
    rep_code_list.each do |rep_code|
      context = Finfolio::GetManagerByRepCode.call(rep_code: rep_code)
      @manager.push({name: context.manager.response.first["Name"], rep_code: rep_code})
    end
    @manager
  end

在这种情况下,将回忆录实例var命名为方法名称的下划线版本- @_manager_rep_code_and_name是一种常见的约定。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49849130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档