2010-08-06 1 views
2

Je suis en train d'écrire une classe Ruby et je souhaite remplacer la méthode ==. Je veux dire quelque chose comme:Création d'une méthode égale sans avoir à rendre public les champs privés

class ReminderTimingInfo 
    attr_reader :times, :frequencies #don't want these to exist 

    def initialize(times, frequencies) 
     @times, @frequencies = times, frequencies 
    end 

    ... 

    def ==(other) 
     @times == other.times and @frequencies == other.frequencies 
    end 
end 

Comment puis-je faire cela sans faire deux fois et les fréquences visibles publiquement?

SUIVI:

class ReminderTimingInfo 

    def initialize(times, frequencies) 
    @date_times, @frequencies = times, frequencies 
    end 

    ... 

    def ==(other) 
    @date_times == other.times and @frequencies == other.frequencies 
    end 

    protected 

    attr_reader :date_times, :frequencies 
end 
+1

N'est-ce pas le point de getters? – NullUserException

+0

ne signifie pas d'upvote votre commentaire, hehe. Je dirais que les getters sont quelque chose à éviter à tout prix. Ce serait bien s'il y avait une forme d'accès protégé ou quelque chose ... Hmmm peut-être qu'il y en a. –

+1

L'état de l'objet doit être aussi privé que possible. Tout ce dont l'utilisateur n'a pas besoin pour passer commande à l'objet doit être invisible pour l'utilisateur. –

Répondre

4

Si vous réglez fois et les fréquences accesseurs à la protection, ils seront accessibles uniquement des instances de cette classe et descendants (qui devrait être ok, car les descendants peuvent accéder aux variables d'instance de toute façon et devrait savoir comment le gérer correctement).

class ReminderTimingInfo 

    # … 

protected 
    attr_reader :times, :frequencies 

end 
+0

merci ... cela a du sens. J'ai choisi de l'implanter légèrement différent ... voir ci-dessus :) –

+0

Vous avez raison. Il fait la même chose, mais semble plus agréable, surtout avec de nombreux attributs (moins de duplication). – Zargony

2

Vous pouvez faire

def ==(other) 
    @date_times == other.instance_eval{@date_times} and @frequencies == other.instance_eval{@frequencies} 
    end 

Mais en quelque sorte je soupçonne que ce qui manque le point!

Questions connexes