我正在创建一个CSV Ruby对象,并且我正在运行一些不同的自定义转换器。我想知道如何将这些转换器中我正在做的事情提取到方法而不是lambdas中。
这就是我所拥有的:
CSV::Converters[:remove_dollar_sign] = lambda {|s| s.gsub(/(\$|\,)/, "") if s.is_a?(String)}
CSV::Converters[:remove_quotes] = lambda {|s| s.gsub("\"","") if s.is_a?(String)}
CSV::Converters[:strip_spaces] = lambda {|s| s.strip if s.is_a?(String)}
CSV::Converters[:remove_hyphens] = lambda {|s| s.gsub(/\A\W/,"0") if s.is_a?(String)}
CSV.parse(
data,
headers: true,
header_converters: [:strip_headers],
converters: [:remove_dollar_sign, :remove_quotes, :strip_spaces, :remove_hyphens]
)
我想为每个转换器创建一个方法,而只是为每个转换器调用方法。例如,CSV :: Converters [:remove_dollar_sign]将成为一个名为'remove_dollar_sign'的方法,我只想使该转换器等于该方法。合理?这样可以更容易地自行测试每个转换器。
我理解lambdas是如何工作的(至少我认为我是这样做的)但是我不确定如果我在这种情况下在转换器中使用它会传递给方法。
答案 0 :(得分:0)
Method#call
的工作方式与Proc#call
类似。
def remove_dollar_sign s; s.gsub(/(\$|\,)/, "") if s.is_a?(String) end
def remove_quotes s; s.gsub("\"","") if s.is_a?(String) end
def strip_spaces s; s.strip if s.is_a?(String) end
def remove_hyphens s; s.gsub(/\A\W/,"0") if s.is_a?(String) end
CSV::Converters.merge!(
remove_dollar_sign: method(:remove_dollar_sign),
remove_quotes: method(:remove_quotes),
strip_spaces: method(:strip_spaces),
remove_hyphens: method(:remove_hyphens),
)
顺便说一句,在gsub
中使用remove_hyphens
没有意义,尽管它有效。