链接方法问题

时间:2015-05-15 17:05:22

标签: ruby methods

所以我有一个看起来像这样的CSV;

This is a test file
,,,,,,,,,,,
1122,Foo,Bar,FooBar
22321,Bar,Bar,Foo
11223,Foo,Foo,Foo,,,,,,,,,
12312/2423/1245,Foo,Foo,,,,,,,,

我想解析它并在我的数组中得到以下结果;

1122,Foo,Bar,FooBar
11223,Foo,Foo,Foo
22321,Bar,Bar,Foo
12312/2423/1245,Foo,Foo

我的代码;

class ReadCSVToArray

    def initialize(file)
      @array  =  CSV.read(file)
    end

    def compact_multi
      y = []
      @array.each { |i| i.compact! ; y << i unless i.blank? }
    end

    def item_rows
      y = []
      @array.each { |o|
        if o[0].include? '/';  y << o ; end
        if o[0].is_number?  ;  y << o ; end
      }
    end
end


the_list = ReadCSVToArray.new('/Users/davidteren/Desktop/read_test.csv')

the_list.compact_multi.item_rows.sort.each { |i| p i }

因此,如上所述,我想链接几种方法来获得我的结果。

我尝试了各种各样的事情;

class ReadCSVToArray

    def initialize(file)
      @array  =  CSV.read(file)
    end

    def compact_multi
      y = []
      @array.each { |i| i.compact! ; y << i unless i.blank? }
      self
    end

    def item_rows
      y = []
      @array.each { |o|
        if o[0].include? '/';  y << o ; end
        if o[0].is_number?  ;  y << o ; end
      }
      self
    end
end

无论我尝试什么,我都无法让它发挥作用。

3 个答案:

答案 0 :(得分:1)

这条线存在问题:

the_list.compact_multi.item_rows.sort.each { |i| p i }

这个链分解为4个方法调用:

the_list.compact_multi
the_list.item_rows
the_list.sort
the_list.each { |i| p i }

通过在selfcompact_multi方法中返回item_rows,您可以确保将链中的下一个方法发送到ReadCSVToArray实例。但是没有ReadCVSToArray#sortReadCSVToArray#each方法。您可能希望在实例变量@array上调用它们。

答案 1 :(得分:0)

result = CSV.parse 'This is a test file
,,,,,,,,,,,
1122,Foo,Bar,FooBar
22321,Bar,Bar,Foo
11223,Foo,Foo,Foo,,,,,,,,,
12312/2423/1245,Foo,Foo,,,,,,,,'

result.map(&:compact).reject { |l| l.size < 2 }
#⇒ [["1122", "Foo", "Bar", "FooBar"], ["22321", "Bar", "Bar", "Foo"],
#    ["11223", "Foo", "Foo", "Foo"], ["12312/2423/1245", "Foo", "Foo"]]

请注意,拒绝清空可能应该更加准确。希望它有所帮助。

要得到这个:

the_list.compact_multi.item_rows.sort.each { |i| p i }

开始工作,compact_multi应该返回selfitem_rows应该返回@array

答案 2 :(得分:0)

您似乎有两个问题,方法链接并获得正确的结果......

您的正确结果问题似乎是您正在分配和构建此y数组,但您在任何这些方法中都没有对其进行任何操作...

def compact_multi
  y = []
  @array.each { |i| i.compact! ; y << i unless i.blank? }
  self
end

def item_rows
  y = []
  @array.each { |o|
    if o[0].include? '/';  y << o ; end
    if o[0].is_number?  ;  y << o ; end
  }
  self
end

你的目标究竟是什么?如果要通过y数组维护结果,那么将其作为实例变量并在initialize方法中初始化...

就您的链接方法问题而言,如果我认为您正在尝试做的事情,您的问题尚不清楚,那么您的方法应该是这样的......

class ReadCSVToArray

    def initialize(file)
      @result = []
      @csv  =  CSV.read(file)
    end

    def compact_multi
      @csv.each { |i| i.compact! ; @result << i unless i.blank? }
      self
    end

    def item_rows
      @csv.each { |o|
        if o[0].include? '/';  @result << o ; end
        if o[0].is_number?  ;  @result << o ; end
      }
      @result
    end
end