在使用rails之前,我从来没有实现过回忆录,我想我为它找到了一个很好的用例,但我不知道如何实现它。下面是我正在做的工作:
方法:
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这个方法,所以如果它已经存在,我就不用再发出这个请求了。
就像这样:
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显然,这不起作用,但我现在有点卡住了。
发布于 2018-04-16 07:19:19
我经常把这类方法分开:
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通常,这也使它们更易于测试。
发布于 2020-12-11 14:27:51
可以使用begin end块回溯多行代码的结果:
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发布于 2018-04-16 03:22:51
如果您想要为相同的函数单独记录输入/输出对,那么记忆化就会稍微复杂一些。由于这里没有输入,每次输出都是预期的或允许相同的,所以回忆录非常简单。就像这样:
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是一种常见的约定。
https://stackoverflow.com/questions/49849130
复制相似问题