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 

我的问题是Ruby只传递了这个:

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

我不擅长编码,仍然在努力学习:-)在此先感谢。

这里有一些问题:

  1. 该方法称为initialize ,而不是Initialize – 大写是重要的。

  2. 你在不同的地方有一堆同名的变量,你似乎认为这些变量是同一个变量,但它们不是。 例如, initialize方法中的score1 = a[1]与line score1 = a[1]中的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 

你错过了向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 

您的第一个问题是拼写错误:该方法应该命名为initialize ,而不是Initialize

我还建议你研究一下Ruby的CSV库 ,它可以更加可靠地解析CSV数据(并且更加惯用)。

我的最后一个建议不是定义show ,而是使用to_s 。 然后你可以简单地puts dance ,对象本身将知道如何转换为字符串。

当你初始化你的Dancer对象时,你并没有传递这对夫妇的数字和分数。

这条线

dancescores << Dancer.new

应该

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

注意你存储的值必须如何传递给Dancer的初始化。