0

これは、Creating a class that inherits from another class in Rubym.one + m.two + m.three が機能しない の続きです。私たちは、経験がほとんどまたはまったくない人向けのコード学習コースであるApp Academyに応募しています。その結果、これらの質問は似ていますが、他の2つの投稿の回答は回答に対処していないと感じましたが、接線の概念を説明することに分岐しました(私は利用しました)

言及された最初の 2 つのリンクをフォローアップするために、継承されたクラスに問題があります。Person クラスから 3 つの変数を継承する Musician クラスがあります。私の問題は、私が

m.first_name + " " + m.last_name + ": " + m.age.to_s

次のエラーが表示されます: person.rb:31: undefined method `+' for nil:NilClass (NoMethodError)。このエラーに答えがあることは理解していますが、これが何を意味するのかまだよく理解できていません。

言及すべき点の 1 つは、上記のクエリはそのままである必要があるということです。その前にPutsを入れることはできません。

+ が未定義のメソッドであるというこのステートメントを取得する理由について、何か提案をいただければ幸いです。

ありがとう!

編集:迅速な対応をありがとう。コーディング コミュニティがこれほど活発であるとは知りませんでした。これは本当に素晴らしいです。最新の問題を反映するようにコードを編集するつもりなので、同じ提案が得られるとは限りません。

4

2 に答える 2

2

アクセサはputs、インスタンス変数の値ではなく、の結果を返します。

まず、すでにを使用しています。attr_readerこれにより、これらのメソッドが生成さます。

次に、first_nameたとえば、次のように返す必要があり@first_nameます。

def first_name
  @first_name
end
于 2012-06-26T20:49:19.120 に答える
2

次のエラーが表示されます: person.rb:31: undefined method `+' for nil:NilClass (NoMethodError)。このエラーに答えがあることは理解していますが、これが何を意味するのかまだよく理解できていません。

これは、3 つの変数の 1 つが であることnil、つまり、値がないことを意味します。

m.first_name
m.last_name

putsこれは、すべてのアクセサーで関数を呼び出した結果を返しているために発生しています。変数を出力して print functionの結果を返すのではなく、変数自体を返す必要があります。

また、すでに使用しattr_readerているgetため、すでにメソッドが作成されています。それが使用の要点ですattr_reader。基になるインスタンス変数を返す関数を作成します。それを初期化するだけです。

たとえば、次のようになります。

class Foo
  def bar
    @bar
  end
end

と同等です

class Foo
  attr_reader :bar
end
于 2012-06-26T20:49:36.687 に答える