0

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: , , , , , , .

私はコーディングが苦手で、まだ勉強中です :-) よろしくお願いします。

4

4 に答える 4

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
于 2012-11-28T17:49:39.593 に答える
3

最初の問題はタイプミスです: メソッドはinitializeではなくという名前にする必要がありInitializeます。

また、 Ruby の CSV ライブラリを調べることをお勧めします。これは、CSV データの解析においてより信頼性の高い (そしてより慣用的な) 作業を行います。

私の最後の提案は、 を定義するshowのではなく、 を使用することto_sです。そうすれば、簡単puts danceにオブジェクト自体が文字列に変換する方法を知ることができます。

于 2012-11-28T17:50:15.350 に答える
1

ここにいくつかの問題があります:

  1. メソッドは と呼ばれますがinitializeInitialize大文字と小文字は重要です。

  2. さまざまな場所に同じ名前の変数がたくさんあります。これらは同じ変数になると思われますが、そうではありません。たとえば、score1メソッドinitializeの は行の と同じではありませんscore1 = a[1]。for なども同様です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
于 2012-11-28T17:51:14.413 に答える
1

Dancer オブジェクトを初期化するとき、カップルの数とスコアを渡しません。

この線

dancescores << Dancer.new

する必要があります

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

保存した値を Dancer の初期化に渡す必要があることに注意してください。

于 2012-11-28T17:49:33.510 に答える