Edición: tres años después; los tiempos están cambiando ...
Julik's answer es la forma más sencilla y mejor manera de abordar el problema en estos días:
class Foo
attr_accessor :dead
alias_method :dead?, :dead # will pick up the reader method
end
Mi respuesta a la pregunta original sigue, para la posteridad ...
la versión corta:
no puede utilizar un signo de interrogación en el nombre de una variable de instancia.
La versión más larga:
Tomemos, por ejemplo, attr_accessor :foo
- es simplemente conceptualmente un poco de azúcar sintáctica para lo siguiente:
def foo
@foo
end
def foo=(newfoo)
@foo = newfoo
end
Por otra parte, el sufijo signo de interrogación es más que nada una convención para indicar que el valor de retorno de un método es un booleano.
La mejor aproximación que puedo hacer de lo que vamos a dar aquí ...
class MyClass
def initialize
@awesome = true
end
def awesome?
@awesome
end
end
En este caso, puede haber un caso que se hizo para el uso de attr_accessor
- después de todo, puede ser explícita que estás trabajando directamente con un atributo booleano. En general, guardo el sufijo de interrogación para cuando estoy implementando un método cuyo valor de retorno booleano se basa en condiciones ligeramente más complejas que solo el valor de un atributo.
¡Salud!
Editar, dos años más tarde, después de una reciente comentario:
- Rubí hace cumplir ciertas convenciones de nomenclatura.
Los símbolos en Ruby no pueden tener signos de interrogación. Por lo tanto, las invocaciones de :my_boolean_attribute?
fallarán con un NameError
. Editar: no es correcta, sólo tiene que utilizar la sintaxis citado para un símbolo, por ejemplo, :"my_attribute?"
- Los símbolos son inmutables, intentar asignar a uno lanzará una
SyntaxError
.
Rubyist generalmente no usa el prefijo is_ ni en nombres de variables ni en nombres de métodos. ¿Simplemente impresionante? en lugar de is_awesome? –
Buen punto, weppos. Editado el 'es_' para evitar la posteridad confusa ;-) –
De esta respuesta me doy cuenta de que no hay una convención real? :/ –