2017-09-24 7 views
-1

Comment puis-je faire fonctionner mon code pour que l'attribut balance n'accède pas directement à la variable d'instance (je crois que c'est @balance)? Quelqu'un peut-il expliquer ce que cela signifie pour un attribut à accéder à une variable d'instance? Je suis novice dans l'utilisation de Ruby et je viens d'apprendre à connaître les classes Ruby. Dans ce chapitre, mes objectifs sont de comprendre le concept des variables d'instance, de démontrer l'utilisation des méthodes getter et setter, de comprendre comment utiliser les méthodes d'instance et de comprendre le concept d'encapsulation.Comment faire en sorte que mon attribut de classe ne puisse pas accéder directement à la variable d'instance?

class BankAccount 
    attr_accessor :balance 

    def initialize(balance) 
    @balance = balance 
    end 

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

Supprimez simplement le 'attr_accessor' et ajoutez votre version de la méthode' balance'. –

+1

BTW, à partir de votre code, ce n'est pas évident __at__tout, pourquoi vous voudriez que 'balance' ne lise pas' @ balance'. –

+0

Vous distinguez "attribut d'équilibre" de "variable d'instance d'équilibre" et cette partie prête à confusion. Question de clarification: programmez-vous avec Rails, et l'attribut "balance" est-il une colonne dans une table de base de données? Sinon, comme l'a souligné @SergioTulentsev, il n'est pas évident pourquoi vous voulez qu'il y ait une distinction. Les méthodes getter et setter créées par 'attr_accessor: balance' sont SUPPOSÉES pour obtenir et définir la variable d'instance (qui est @balance). – Isaac

Répondre

1

Dans Ruby attr_reader :balance est plus ou moins juste une version pratique de la méthode suivante:

def balance 
    @balance 
end 

De même, attr_writer :balance est juste une forme courte pour

def balance=(value) 
    @balance = value 
end 

Et attr_accessor :balance est court pour attr_reader :balance, plus attr_writer :balance.

Donc comme vous pouvez le voir attr_readeraccédant la variable d'instance n'a rien de spécial, par exemple. dans votre code, vous accédez également à la variable d'instance dans #initalize et #withdraw.

Vous devez préciser pourquoi vous ne souhaitez pas y accéder directement. Et ce que cela signifie même. Parce que vous pouvez soit accéder à la variable d'instance en utilisant @balance ou non, il n'y a pas indirect à mon avis.

0

Définir votre propre version de la méthode de lecture 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 

Maintenant, lorsque vous appelez la méthode balance, il avait lu votre valeur et un rendement défini en conséquence.