1

私は正しい方向に進んでいると思いますが、p.first_nameを呼び出そうとすると。スクリーンショットに表示されているエラーが表示されますが、私が間違っていることを誰かが知っていますか?

スクリーンショットhttp://snag.gy/pj6ny.jpg 表示されない場合のリンクは次のとおりです:http ://snag.gy/pj6ny.jpg

コードは次のとおりです。

class Person 

    def initialize (first_name, last_name, age)  
        @first_name = first_name  
        @last_name = last_name
        @age = age  

    end  
end

私が入るときはすべて大丈夫です

> p = Person.new("Earl", "Rubens-Watts", 2)

しかし、その後は奇妙になります。必要な出力は次のとおりです。

 > p = Person.new("Earl", "Rubens-Watts", 2)
  > p.first_name
  => "Earl"
  > p.last_name
  => "Rubens-Watts"
  > p.age
  => 2

ありがとう!

4

2 に答える 2

6

メソッドを定義していないfirst_nameか、属性を宣言していません。これを試して:

class Person 
    attr_reader :first_name, :last_name, :age
    def initialize (first_name, last_name, age)  
        @first_name = first_name  
        @last_name = last_name
        @age = age
    end
end
于 2012-06-15T04:00:55.353 に答える
1

値を指定してコンストラクターを呼び出すと、インスタンス変数としてオブジェクトnewに適切に格納されます。pただし、それらを読み取るための相対メソッドgetter(OOP の通常のメソッド) を作成しないと、オブジェクトのスコープ外からはアクセスできません。

そうするために:

class Person

    attr_reader: :first_name, :last_name, :age

    def initialize (first_name, last_name, age)
        @first_name = first_name
        @last_name = last_name
        @age = age
    end

end

それらの値を外部からも変更する必要がある場合は、attr_accessor代わりに、自動的にgetterおよびsetterメソッドを提供するを使用してください。

于 2012-06-15T04:09:22.957 に答える