2016-05-06 3 views
1

最近、私はクラスを作成する方法を学びましたが、私はENTIRELYを使用する必要があります。 私はそれらを使って類似のメソッド/プロパティを持つオブジェクトを作成します。ルビーでインスタンス変数を呼び出す方法

私はギャグコードを作ってみましたが、私は答えが見つからない質問に遭遇しました。

class Person 
    def initialize(name,health) 
    @name = name 
    @hp = health 
    end 

    def kick 
    @hp -= 1 
    if (@hp <= 0) 
     puts "#{@name} got REKT!" 
    end 
    end 

end 

#Friends 
michael = Person.new("Michael", 10) 

10.times { michael.kick } 

このコードは機能しますが、クラス外でmihchaelのhpを使用することは可能でしょうか?ハッシュのようなものでしょうか? michael[@hp]?しかし、これはうまくいきません。たとえ私がhpをグローバル変数に設定しても、動作しません。 オブジェクトのプロパティをチェックするすべてのif/elseステートメントがクラス内にあるべきですか?

puts "#{michael.name} has only #{michael.hp} HP left" 

:あなたはのようなものを呼び出すことができ、クラスの外に続いて

class Person 
    attr_reader :name 
    attr_reader :hp 
end 

+0

私はattr_accessorを探していると思います。 'attr_accessor:hp' –

+3

この質問では' attr_accessor'について読むことをお勧めします:http://stackoverflow.com/questions/4370960/what-is-attr-accessor-in-ruby –

+5

あなたのコードを変更するのが簡単になるように、画像ではなくテキストです。 – nwk

答えて

5

Rubyでこれを行うための標準的な方法は、アクセサを作成することですありがとうございましたオブジェクトを作成する理由は、コードとデータを論理コンテキストとコンテナに整理するためです。

+0

の一部のエディションでエラーが発生しましたが、アクセサーがない場合#{michael.instance_variable_get(:@ name)}は#{michael.instance_variable_get(:@ hp)}しか持っていません。 [Object#instance_variable_get](http://ruby-doc.org/core-2.2.0/Object.html#method-i-instance_variable_get)を参照してください。 –

+4

@CarySwoveland Trueですが、これは誰かのズボンに手を伸ばしてキーをつかむことに相当します。あまり丁寧ではありません。アクセサーはパーミッションを求める最善の方法ですが、クラスが自由に値を格納する方法を変更できることを意味します。 – tadman

+0

@tadman attr_reader:keysが使用されている場合、私たちはズボンのポケットに\ @keys属性を保持しませんが、 '\ @キーはドアの隣のフックにあります'と宣伝します。 attr_reader:keysの仕組みを理解していない。基本的には、インタプリタにdefキーを定義するよう指示します。 \ @キー;終了。したがって、attr_readerを削除してメソッドキーを定義すると、簡単に変更を行うことができます。 –

関連する問題