2017-01-04 8 views
-2

を理解する:私はこのようなクラスを作成する場合はRubyのセッター

class Player 

    def initialize(position, name) 
    @position = position 
    @name = name 
    end 

end 

は、インスタンス変数に名前を設定することはありませんか?もしそうなら、なぜこのようなセッターを書く必要がありますか?

class Player 

    def initialize(position, name) 
    @position = position 
    @name = name 
    end 

    def name=(name) 
    @name = name 
    end 

end 

基本的にクラスにゲッターを書く必要があるのですか?

+1

あなたの例はすべてsetter *に関するものですが、あなたの "基本的な"要約では* getters *に関する話があります。それはタイプミスか意図的なのでしょうか? –

答えて

0

「アクセサ」とも呼ばれるゲッター/セッターは、クラス外でアクセスできますが、インスタンス変数はアクセスできません。あなたが物事を読んだり、変更したりできるようにしたい場合は、の外にある@nameからアクセサーを定義してください。

アクセサーメソッドを使用すると、一定量の正常性チェックを実行したり、着信/発信値を変更したり、オブジェクトの内部状態を保護することができます。

1

initializeは、新しいオブジェクトの初期化中に属性を設定します。

keeper = Player.new('goalkeeper','Shilton'). 

アトリビュートをkeeperに更新したい場合はどうすればよいですか?あなたはプレーヤーのインスタンスに対して定義されたsetterメソッドを持っていない場合は、あなたがこれを行うことはできません

keeper.name = 'Banks' 

:とても似

def name=(name) 
    @name = name 
end 

:さてあなたは、あなたの一般的なsetterメソッドを使用する必要があります。 getterメソッドの場合も同様です。また、あなたがそうのようなattr_accessorを使用してコードをリファクタリングすることができます注意してください。

class Player 
    attr_accessor :name, :position 

    def initialize(position, name) 
    @position = position 
    @name = name 
    end  
end 
0

ゲッターとセッターの仕事は、あなたがあなたのコンストラクタで定義するインスタンス変数の読み取りと書き込みの迅速な実装を提供することである。

class Player 
    attr_accessor :name, :position 
    def initialize(position, name) 
    @position = position 
    @name = name 
    end 
end 

ユーザーはattr_reader(ゲッタ用)とattr_writer(セッタ用)も指定できます。上記のコード

#name#position#name=を、そしてPlayerクラスのインスタンスの#position=方法:attr_accessor :name, :positionはあなたが与えます。

しかし、getters/setterの検証やカスタマイズされたロジックは提供しません。例えば

:あなたはプレイヤーのフルネームを表示したい場合があります。また、ゲッターを書いて、自分をセッターする必要があると思い、このような場合には、0または負の位置を受け入れるようにあなたのコードを望んでいない:

class Player 
    def initialize(first_name, last_name, position) 
    @first_name = first_name 
    @last_name = last_name 
    @position = position 
    end 

    # validation for updating position using setter of position 
    def position=(new_position) 
    raise "invalid position: #{new_position}" if new_position <= 0 
    @position = new_position 
    end 

    # customized getter for name method 
    def name 
    "#{@first_name} #{@last_name}" 
    end 
end 

上記のようにカスタマイズする必要がない場合は、これらの変数にattr_*メソッドを使用する方が理にかなっています。

関連する問題