2010-08-12 11 views
6

Estoy intentando agregar una propiedad llamada "habilitada?" a un modelo con un getter y un setter. Sin embargo, cuando lo haga lo siguiente:¿Cómo se define un setter para una propiedad cuyo nombre termina con un signo de interrogación?

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

me sale syntax error, unexpected '?', expecting '\n' or ';'

¿Qué debería estar haciendo en su lugar?

+1

No utilice puntuacion en los nombres de variables. – DanDan

+4

@DanDan: ¿Cómo usar? para boolean getters es el estándar en ruby ​​y no hacerlo sería bastante unidiomático. – sepp2k

Respuesta

10

Sí, la sintaxis de ruby ​​solo permite ? en los nombres de métodos si es el último carácter, por lo que foo?= no es válido. Una cosa que podría hacer, que sería bastante idiomático, es definir enabled?, enable y disable (o enable! y disable! si desea enfatizar que están cambiando los métodos).

Si eso no se ajusta a sus necesidades, puede simplemente nombrar los métodos enabled? y enabled= y vivir con la ligera incosistencia entre los nombres.

+0

La información sobre qué signos de admiración suelen significar se describe en [ Diferencia entre downcase y downcase! en Ruby] (http://stackoverflow.com/questions/709229/difference-between-downcase-and-downcase-in-ruby/709271) –

7

Un nombre de método en ruby ​​comienza con una letra minúscula o guión bajo opcionalmente seguido de letras mayúsculas y minúsculas y guiones bajos. Un nombre de método puede terminar opcionalmente con un signo de interrogación, signo de exclamación o signo igual.

¡Así que no puedes!

Usted puede seguir el lenguaje habitual de definir rubí habilitado la siguiente manera: -

def enabled? 
    @enabled 
end 

def enabled=(value) 
    @enabled = value 
end 

de resumir. Si desea exponer las propiedades al mundo exterior, asegúrese de que su nombre de variable lo permita dentro de los límites de las reglas para nombres de métodos.

0

Nombre su propiedad simplemente enabled

Los métodos de consulta son simplemente azúcar sintáctica, no se significan para ser utilizado como propiedades o variables de instancia. Puede agregar el método enabled? para azúcar sintáctico si lo desea también.

0

Siempre nombro mis variables booleanas para comenzar con 'es', como en 'isEnabled'. Entonces tiene el mismo significado que tener el signo de interrogación sin la necesidad de complejidad.

+3

Sería mejor seguir los estándares de ruby ​​/ rails (no parece 'complejo' 'para mí, ¿justo? al final). De lo contrario, el código que se comparte con otros desarrolladores será difícil de leer ya que el lector/mantenedor ahora tendrá que usar su enfoque para el código en lugar del estándar o simplemente usar ambos, que es aún peor. Solía ​​hacer esto yo mismo con _yn al final hasta que aprendí mejor –

+0

Siempre use los estándares. Únete a una banda si quieres seguir tu propio camino. –

1

Una pequeña variación sería poner un alias para el método de obtención, que permite tanto enabled y enabled?:

def enabled 
    @enabled 
end 

def enabled=(value) 
    @enabled = value 
end 

alias_method :enabled?, :enabled 
Cuestiones relacionadas