如何在ruby中创建一个类对象数组

时间:2016-05-05 09:45:18

标签: arrays ruby

我正在尝试创建一个类对象数组,但我的代码不起作用。当我创建一个Solution.new时,它返回nil,我希望它从test.txt的每一行中的单词返回一个数组数组。 我正在使用Ruby 2.1.5

class Line 
  def initialize (content)
    @content = content
    self.line_arr
  end
  def line_arr
    @content.split
  end
end

class Solution
  def read_file
    array = []
    File.foreach('test.txt') do |line|
      array << Line.new(line)
    end
  end
end

现在我做了一个

foo = Solution.new
foo.read_file

返回nil

5 个答案:

答案 0 :(得分:3)

我不认为Solution.new在您的示例中返回nil,它会返回一个新的解决方案实例(foo在您的示例中)

您的主要问题是read_file返回File.foreach的值,该值始终为nil

对于初学者,请更新您的read_file方法以返回阵列本身:

class Solution
  def read_file
    array = []
    lines = []

    File.foreach('test.txt') do |line|
      lines << Line.new(line)
    end

    array << lines

    array
  end
end

solution = Solution.new
solution.read_file
# outputs:
# [#<Line:0x007fab92163b50 @content="This Is A Line\n">, #<Line:0x007fab92161be8 @content="Line 2\n">, #<Line:0x007fab92160d88 @content="Line3">]

如果要返回按空格分割每行的数组数组:

class Solution
  def read_file
    lines = []
    File.foreach('test.txt') do |line|
      words = []
      line.strip.split(/\s+/).each do |word|
        words << word
      end

      lines << Line.new(words)
    end

    lines
  end
end

这里的关键代码是:line.strip.split(/\s+/)首先从字符串中去掉前导和尾随空格,然后通过基于空格分割字符串将其转换为数组(/s+/正则表达式匹配一个或更多空白字符)。

其他一些建议:

将文件名作为参数传递给read_file如果您想要设置默认参数:

class Solution
  def read_file(filename = 'test.txt')
    array = []
    File.foreach(filename) do |line|
      array << Line.new(line)
    end

    array
  end
end

最后,要获得更优雅的解决方案,您可以使用map,只需调用.split即可返回嵌套数组。在这种情况下,Line班级并没有做太多事情。

class Solution
  def read_file
    File.foreach('test.txt').map do |line|
      line.strip.split(/\s+/)
    end
  end
end

这将返回一个数组数组,其中内部数组包含每行的单词。

答案 1 :(得分:0)

试试这个:

class Line 
  def initialize (content)
    @content = content
    self.line_arr
  end
  def line_arr
    @content.split
  end
end

class Solution

  def initialize
     self.read_file 
  end

  def read_file
    array = []
    File.foreach('test.txt') do |line|
      array << Line.new(line)
    end
    array
  end
end

答案 2 :(得分:0)

class Line
  attr_reader :content

  def initialize (content)
    @content = content.split(' ')
  end
end

class Solution
  def read_file
    array = []

    File.foreach('test.txt') do |line|
      array << Line.new(line).content
    end

    array
  end
end

您需要添加此“数组”行,因为您需要从方法调用中返回它。我在这里简化了一下Line类。基本上,这段代码可以解决您的问题,但考虑使用正则表达式来解析行。

答案 3 :(得分:0)

考虑使用Enumerable#inject而不是创建不必要的变量:

class Solution
  def read_file
    File.foreach('test.txt').inject([]) do |memo, line|
      memo << Line.new(line)
    end
  end
end

或者,在这种特殊情况下,map可以解决问题:

class Solution
  def read_file
    File.foreach('test.txt').map &Line.method(:new)
  end
end

答案 4 :(得分:0)

如果您只需要获取单词数组,并且不介意一次将整个文件加载到内存中,那么可以使用下面的代码非常简单地完成(3行以{{1开头)其余的是设置和输出):

word_arrays = ...