2017-09-24 15 views
-1

バランス属性がインスタンス変数(@balanceと思う)に直接アクセスしないようにコードを直接作成するにはどうすればよいですか?誰かが属性の意味を説明できるかインスタンス変数?クラス属性がインスタンス変数に直接アクセスできないようにするにはどうすればよいですか?

私はRubyを初めて使用していて、Rubyクラスについて学んでいます。この章では、私の目的は、インスタンス変数の概念を理解し、ゲッターとセッターのメソッドを実証し、インスタンスメソッドを使用する方法を理解し、カプセル化の概念を理解することです。

class BankAccount 
    attr_accessor :balance 

    def initialize(balance) 
    @balance = balance 
    end 

    def withdraw(amount) 
    if (balance >= amount) 
     @balance = balance - amount 
    end 
    end 
end 
+1

'attr_accessor'を削除し、あなたのバージョンの' balance'メソッドを追加してください。 –

+1

ところで、あなたのコードから、__at all__は明白ではありません。なぜ、 'balance'が' @ balance'を読み込まないようにしたいのですか? –

+0

"balance attribute"と "balance instance variable"を区別すると、その部分が混乱します。明確化の質問:あなたはRailsを使ってプログラミングしていますか?データベーステーブルの列の "バランス属性"ですか?そうでなければ、@ SergioTulentsevのように、なぜあなたはそれを区別したいのか分かりません。 'attr_accessor:balance'で作成されたgetterメソッドとsetterメソッドは、インスタンス変数(@balance)を取得して設定するためにサポートされています。 – Isaac

答えて

1

は、以下の方法の多かれ少なかれ単に便利なバージョンである:

def balance 
    @balance 
end 

同様に、attr_writer :balance

def balance=(value) 
    @balance = value 
end 

そしてattr_accessor :balanceためだけ短い形態であるattr_reader :balanceための短いプラスattr_writer :balance

attr_readerにアクセスすると、インスタンス変数は何も特別なものではありません。あなたのコードでは、#initalize#withdrawのインスタンス変数にもアクセスします。

なぜ直接アクセスしたくないのかを明確にする必要があります。それが意味することは何ですか? @balanceを使用してインスタンス変数にアクセスすることができるため、間接という意見はありません。

0

balanceリーダーメソッドの独自のバージョンを定義します

class BankAccount 
    attr_accessor :balance 

    def initialize(balance) 
    @balance = balance 
    end 

    def withdraw(amount) 
    if (balance >= amount) 
     @balance = balance - amount 
    end 
    end 

    def balance 
    'balance from method directly' 
    end 
end 

あなたがbalanceメソッドを呼び出すときに今、それはあなたの定義されたものを読んだし、それに応じて値を返します。ルビーattr_reader :balance

関連する問題