Ruby 记忆在过程中起作用吗?

Ruby 记忆在过程中起作用吗?,ruby,memoization,proc,ruby-1.8.7,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

我有以下方法:

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
请记住,我使用的是ruby 1.8.7,但也欢迎提供关于1.9+的信息

主要的问题是proc内部的三元数只需要在第一次计算出来,所以我不希望每次调用proc get时都计算出来

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

template = proc {|tem,word|tem % word}.curry(type ?  "%s_#{type}_csv" : "%s_csv")
但出于某种原因,它一直在以
没有将字符串隐式转换为整数
我认为ruby将
%
解释为模数,而不是字符串模板。 即使像这样包装
tem
“#{tem}”也没有真正起作用


此外,咖喱对我来说也不太管用,因为它在1.8.7中不可用,但值得一试

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

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" 

我认为,如果标题总是相同的(必须给出您的语句),那么最好在该块之外的范围内计算它(作为“download_link_for()”中的第一条语句)。因此:
saved_title=title?”%s#{title}{csv:“%s_csv”
template=proc{124; word saved_title%word(我猜注释中没有代码格式。这是上面两行不同的内容。)我只是尝试了下面的
template=proc{word | b | | | | | b | |=0;b+=1;puts b;(type?%s#{type}csv):“%s|csv”)%word
它每次都打印
1
,我想这回答了这个问题,因为它意味着每次调用proc时都会重新计算b。我想我可能必须在开始时先计算它……等等,如果我尝试了……我有个主意。这是一个实际的性能问题吗?proc似乎没什么作用……因为我喜欢尽可能的干涸,就像这样,我只写了一次模板制作代码,但我也希望三元也做一次。
template = proc { |word| @title ||= word }

template.call "hello"
 => "hello" 

template.call "goodbye"
 => "hello"