2010-08-12 8 views
6

J'essaie d'ajouter une propriété appelée "enabled?" à un modèle avec à la fois un getter et un setter. Cependant, quand je fais ce qui suit:Comment définir un setter pour une propriété dont le nom se termine par un point d'interrogation?

def enabled?= value 
    # .. logic goes here .. 
end 

Je reçois syntax error, unexpected '?', expecting '\n' or ';'

Que dois-je faire à la place?

+1

Ne pas utiliser la ponctuation dans les noms de variables. – DanDan

+4

@DanDan: Utilisation? pour les acquéreurs booléens est la norme en ruby ​​et ne pas le faire serait tout à fait unidiomatic. – sepp2k

Répondre

10

Oui, la syntaxe ruby ​​n'autorise que ? dans les noms de méthode si c'est le dernier caractère, donc foo?= n'est pas valide. Une chose que vous pourriez faire, ce serait assez idiomatique, est de définir enabled?, enable et disable (ou enable! et disable! si vous voulez souligner qu'ils sont des méthodes de mutation).

Si cela ne correspond pas à vos besoins, vous pouvez simplement nommer les méthodes enabled? et enabled= et juste vivre avec la légère incohérence entre les noms.

+0

Les informations sur ce que les points d'exclamation signifient généralement sont décrites dans [ Différence entre le bas et le bas! dans Ruby] (http://stackoverflow.com/questions/709229/difference-between-downcase-and-downcase-in-ruby/709271) –

7

Un nom de méthode dans ruby ​​commence par une lettre minuscule ou un trait de soulignement suivi éventuellement de caractères de soulignement et de chiffres minuscules et minuscules. Un nom de méthode peut éventuellement se terminer par un point d'interrogation, un point d'exclamation ou un signe égal.

Donc, vous ne pouvez pas!

Vous pouvez suivre l'idiome rubis habitude de définir activé comme suit: -

def enabled? 
    @enabled 
end 

def enabled=(value) 
    @enabled = value 
end 

Pour résumer. Si vous souhaitez exposer les propriétés au monde extérieur, assurez-vous que le nom de votre variable le permette dans les limites des règles pour les noms de méthodes.

0

Nom de votre propriété juste enabled

Les méthodes d'interrogation ne sont que du sucre syntaxique, ils ne sont pas l'intention d'être utilisés comme propriétés ou variables d'instance. Vous pouvez ajouter la méthode enabled? pour le sucre syntaxique si vous le souhaitez aussi.

0

Je nomme toujours mes variables booléennes pour commencer par 'is', comme dans 'isEnabled'. Ensuite, il a le même sens que d'avoir le point d'interrogation sans le besoin de complexité.

+3

Il serait préférable de suivre les normes ruby ​​/ rails (ne semble pas complexe 'à moi - juste? à la fin). Sinon, le code partagé avec d'autres développeurs sera difficile à lire car le lecteur/mainteneur devra maintenant utiliser votre approche pour le code plutôt que la norme ou simplement utiliser les deux, ce qui est encore pire. J'avais l'habitude de faire moi-même avec _yn à la fin jusqu'à ce que j'ai appris mieux –

+0

Toujours utiliser les normes. Rejoignez un groupe si vous voulez suivre votre propre chemin. –

1

Une petite variation serait un alias de la méthode de lecture, permettant à la fois enabled et enabled?:

def enabled 
    @enabled 
end 

def enabled=(value) 
    @enabled = value 
end 

alias_method :enabled?, :enabled 
Questions connexes