【发布时间】:2016-10-11 14:14:43
【问题描述】:
我有以下方法:
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
问题是过程。 我想知道记忆功能是否在 proc 内部有效?专门用于:
title ? "%s_#{title}_csv": "%s_csv"
请记住,我正在使用 ruby 1.8.7,但也欢迎提供有关 1.9+ 的信息。
主要问题是 proc 内部的三元组只需要第一次计算出来,所以我不希望它在每次调用 proc get 时都计算它。
编辑:我的想法是像这样使用柯里化:
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 中不可用,但值得一试。
【问题讨论】:
-
我想,如果标题总是相同的(必须给出你的声明,最好在该块之外的范围内计算它(作为第一个语句) 'download_link_for()')。所以:
saved_title = title ? "%s_#{title}_csv": "%s_csv"template = proc {|word| saved_title% word }(我猜在 cmets 中没有代码格式。这是上面的两行单独的行。) -
我刚刚尝试了以下
template = proc {|word|b||= 0;b+=1; puts b;(type ? "%s_#{type}_csv": "%s_csv") % word},并且每次都打印1,我猜这回答了这个问题,因为这意味着每次调用proc时都会重新计算b。我在想我可能必须在开始时先计算它......等等如果我尝试......我有一个想法。 -
这是一个实际的性能问题吗? proc似乎没有做太多...
-
因为我喜欢尽可能的干,所以我只写代码做一次模板,但我也希望三元也做一次。
标签: ruby memoization proc ruby-1.8.7