2015-09-07 29 views
0

我在厨师的食谱,像这样如何红宝石拉姆达转换为可重复使用的库法

被称为像这样

overwrite_properties.call("#{server_home}/config.orig/#{fname}", params) 

有一个方法,我的问题是如何转换这到一个可从另一个模块调用的可重用函数?

例如。

module HelperMod 
    def self.overwrite_properties(&block) 
     //etc 
    end 
end 

感谢

回答

1

这很简单 - 一个lambda是一个匿名函数(没有名字的函数)。您可以在模块内将此转换为功能,像这样:

module HelperMod 
    def self.overwrite_properties(tmpl_path, params) 
    attrs = {} 
    File.read(tmpl_path).split("\n").map do |line| 
     line = line.sub(/#.*$/, '').strip 
     j, v = line.split(/\s*=\s*/, 2) 
     attrs[j] = v if j 
    end 
    params.each {|j,v| v.nil? ? attrs.delete(j) : attrs[j] = v } 
    attrs.map {|j,v| "#{j}=#{v}\n" }.sort.join 
    end 
end 

HelperMod.overwrite_properties("#{server_home}/config.orig/#{fname}", params) 
+1

我会用'.',而不是''::对于方法调用,即'HelperMod.overwrite_properties(...)' – Stefan

+0

@stefan,更新 - thx。 –