memoization在proc中运行吗?

时间:2016-06-10 14:46:40

标签: ruby memoization proc ruby-1.8.7

我有以下方法:

def download_link_for(site,title=nil)
  template = proc {|word|(title ?  "%s_#{title}_csv": "%s_csv") % word}

  if site.send(template.call("update")) == false
    x.a "Generate", :href => "/#{template.call("generate")}/#{site.id}"
  else
    xpr "Generating.."
  end
  if site.send(template.call("latest")) > 0 && site.send(template.call("update")) == false
    %|

  <a href="/#{template.call("download")}/#{site.id}" class="tooltip-left" title="Download the #{title} as a .csv file" id="download_pdf">
    <img src="/images/csv_download.png" alt="Download"/>
  </a>
  (#{timedate(site.send(template.call("latest")))})
    |

  end
end

问题是过程。 我想知道memoization是否在proc中运行?专门针对:

title ?  "%s_#{title}_csv": "%s_csv"

请记住我正在使用ruby 1.8.7,尽管有关1.9+的信息也会受到欢迎。

主要问题是proc中的三元组只需要第一次处理出来,所以每次调用proc时都不希望它计算出来。

编辑:我的想法是像这样使用currying:

template = proc {|tem,word|tem % word}.curry(type ?  "%s_#{type}_csv" : "%s_csv")

但由于某种原因,它一直在回应 no implicit conversion of String into Integer我认为ruby将%解释为模数而不是字符串模板。 即使像tem那样包裹"#{tem}"也没有真正起作用。

另外,咖喱不适合我,因为它在1.8.7中不可用,但它值得一试。

1 个答案:

答案 0 :(得分:2)

不确定为什么需要咖喱。你不能只使用一个实例变量来存储/记忆三元运算的结果吗?

template = proc { |word| @title ||= (title ? "%s_#{title}_csv" : "%s_csv"); @title % word }

在irb:

template = proc { |word| @title ||= word }

template.call "hello"
 => "hello" 

template.call "goodbye"
 => "hello"