将CSV转换器提取到方法中

时间:2014-04-01 06:43:56

标签: ruby csv

我正在创建一个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是如何工作的(至少我认为我是这样做的)但是我不确定如果我在这种情况下在转换器中使用它会传递给方法。

1 个答案:

答案 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没有意义,尽管它有效。