我正在尝试创建一个类对象数组,但我的代码不起作用。当我创建一个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
。
答案 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 = ...