2016-05-05 86 views
1

我想要創建一個類對象的數組,但我的代碼無法工作。當我創建Solution.new時,它返回nil,我希望它返回每行test.txt中單詞的數組數組。 我使用Ruby 2.1.5如何在ruby中創建一個類對象數組

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

Ruby總是返回方法中的兩件事情之一:你告訴它使用'return'關鍵字,或者如果它告訴它,方法中最後一個表達式的值。 –

+0

此外,您的標題與您的問題完全不同。你的問題更像是「爲什麼這個方法返回nil而不是數組?」 –

回答

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類。基本上,這段代碼可以解決你的問題,但考慮使用正則表達式來解析行。

+0

儘管此代碼可能回答此問題,但提供 有關_why_和/或_how_的附加上下文,它將回答 該問題將顯着改善其長期值 的值。請[編輯]你的答案,添加一些解釋。 –

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 
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+/正則表達式匹配一個或多個空字符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 

這將簡單地返回一個數組數組,其中內部數組包含每行的單詞。

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 
0

如果你需要做的就是數組並且您不介意將整個文件一次加載到內存中,那麼可以使用下面的代碼非常簡單地完成(3行以word_arrays = ...開頭,其餘的是設置和輸出):

#!/usr/bin/env ruby 

File.write('woods.txt', 
"The woods are lovely, dark, and deep 
But I have promises to keep 
And miles to go before I sleep 
And miles to go before I sleep") 

word_arrays = File.readlines('woods.txt').each_with_object([]) do |line, word_arrays| 
    word_arrays << line.split 
end 

word_arrays.each.with_index do |words, index| 
    puts "#{index}: #{words} " 
end 

=begin 
Prints: 

0: ["The", "woods", "are", "lovely,", "dark,", "and", "deep"] 
1: ["But", "I", "have", "promises", "to", "keep"] 
2: ["And", "miles", "to", "go", "before", "I", "sleep"] 
3: ["And", "miles", "to", "go", "before", "I", "sleep"] 
=end 
相關問題