2012-11-28 60 views
0

我遇到了ruby問題,它不會將我已加載的文件加載到指定數組中。Ruby - 不會將文件加載到數組中

class Dancer 
    def Initialize (couplenumber, score1, score2, score3, score4, score5, score6, score7) 
    @couplenumber = couplenumber 
    @score1 = score1 
    @score2 = score2 
    @score3 = score3 
    @score4 = score4 
    @score5 = score5 
    @score6 = score6 
    @score7 = score7 
    end 

    def show() 
    return "Couple Number: #{@couplenumber}. Scores: #{@score1}, #{@score2}, #{@score3}, #{@score4}, #{@score5}, #{@score6}, #{@score7}." 
    end 
end 

results = File.open("danceresult.txt", "r+") 
dancescores = [] 

# Splitting dance scores with "," and putting into arrays. 
for dancers in results 
    a = dancers.split(",") 
    couplenumber = a[0] 
    score1 = a[1] 
    score2 = a[2] 
    score3 = a[3] 
    score4 = a[4] 
    score5 = a[5] 
    score6 = a[6] 
    score7 = a[7] 
    dancescores << Dancer.new 
end 

dancescores.each do |dance| 
    puts dance.show 
end 

我的問題是紅寶石只有通過這樣的:

Couple Number: . Scores: , , , , , , . 
Couple Number: . Scores: , , , , , , . 
Couple Number: . Scores: , , , , , , . 
Couple Number: . Scores: , , , , , , . 
Couple Number: . Scores: , , , , , , . 
Couple Number: . Scores: , , , , , , . 

我不是在編碼,仍然努力學習:-)在此先感謝非常好。

回答

1

的幾個問題在這裏:

  1. 的方法被稱爲initialize,不Initialize - 資本是非常重要的。

  2. 你在不同的地方有一堆名稱相同的變量,你似乎認爲這些變量是相同的變量,但它們不是。例如,initialize方法中的score1方法與score1 = a[1]行中的方法不同。同樣適用於couplenumber等。

  3. 由於前面幾點,你插入到數組中的是一個空的Dancer對象,它沒有任何實例變量被設置爲任何東西。

下面的代碼的修正版本:

class Dancer 
    def initialize(couplenumber, score1, score2, score3, score4, score5, score6, score7) 
    @couplenumber = couplenumber 
    @score1 = score1 
    @score2 = score2 
    @score3 = score3 
    @score4 = score4 
    @score5 = score5 
    @score6 = score6 
    @score7 = score7 
    end 

    def show() 
    return "Couple Number: #{@couplenumber}. Scores: #{@score1}, #{@score2}, #{@score3}, #{@score4}, #{@score5}, #{@score6}, #{@score7}." 
    end 
end 

results = File.open("danceresult.txt", "r+") 

# Splitting dance scores with "," and putting into arrays. 
# Note that we're using map, which handles collecting the results into an array for us 

dancescores = results.map |dancers| 
    a = dancers.split(",") 
    Dancer.new(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]) 

    # You could more simply write the previous line as 
    # Dancer.new(*a[0..7]), but that's 
    # essentially just syntactic sugar for the above 
end 
1

當你初始化你的舞者對象時,你沒有傳入夫妻數和得分。

dancescores << Dancer.new

應該

dancescores << Dancer.new(couplenumber, score1, score2, score3, score4, score5, score6, score7) 

通知您存儲的值怎麼也得要傳遞給舞者的初始化。

6

你錯過傳遞參數給Dancer

我還建議重構你的代碼是這樣的:

class Dancer 
    def initialize(couplenumber, *scores) 
    @couplenumber, @scores = couplenumber, scores 
    end 

    def show 
    return "Couple Number: #{@couplenumber}. Scores: #{@scores.join(', ')}" 
    end 
end 

file = "danceresult.txt" 
dancescores = File.readlines(file).map do |line| 
    Dancer.new *line.split(",") 
end 
+0

這'高清初始化couplenumber,* scores'方法定義是很奇怪的,我想大多數人會發現,風格難以閱讀。 – Chuck

+0

@Chuck,splat-args是相當普通的Ruby。我讀過它,經常使用它。如果我記得,它也在標準庫中看到。 –

+0

毫米,「'*分數是非常奇怪的」,@Chuck,這是一種笑話嗎? –

3

你的第一個問題是一個錯字:該方法應該命名爲initialize,不Initialize

我也建議你看看Ruby's CSV library,這將做一個更可靠的工作解析CSV數據(並更加習慣)。

我最後的建議不是定義show,而是使用to_s。然後,你可以簡單地puts dance和對象本身將知道如何轉換爲一個字符串。