Ruby: atributo booleano convención de nomenclatura y uso
-
13-09-2019 - |
Pregunta
El aprendizaje rubí. Estoy bajo la impresión de que los atributos booleanos deben ser nombrados de la siguiente manera:
my_boolean_attribute?
Sin embargo, consigo errores de sintaxis cuando se trata de hacer lo siguiente:
class MyClass
attr_accessor :my_boolean_attribute?
def initialize
:my_boolean_attribute? = false
end
end
Al parecer, el rubí es odiar el "?". ¿Es esta la convención? ¿Qué estoy haciendo mal?
Solución
Editar: tres años más tarde; los tiempos están cambiando ...
de Julik respuesta 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 se 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
Además, 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 valor lógico.
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á trabajando directamente con un atributo booleano. En general, ahorro el sufijo signo de interrogación para cuando me estoy poniendo en práctica un método cuyo valor de retorno booleano se basa en condiciones ligeramente más complejo que el valor de un atributo.
Saludos!
Editar, dos años más tarde, después de un reciente comentario:
- Rubí hace cumplir ciertas convenciones de nomenclatura.
Símbolos en Ruby no pueden tener signos de interrogación. Por lo tanto invocaciones deEdit:. No es correcta, sólo tiene que utilizar la sintaxis citado para un símbolo, por ejemplo,:my_boolean_attribute?
tanto fallarán con unNameError
:"my_attribute?"
- Los símbolos son inmutables, intentar asignar a uno lanzará una
SyntaxError
.
Otros consejos
La forma más fácil de añadir rápidamente un "método pregunta" es el uso de alias para el método lector
class Foo
attr_accessor :dead
alias_method :dead?, :dead # will pick up the reader method
end
El símbolo attr_accessor
implica que el nombre de la variable es @my_boolean_attribute
, así que eso es lo que debe estar fijándose (no el símbolo).
Además, no se puede utilizar? para las variables, nombres solo método.
? es convención para methodnames, no variables. No se puede utilizar un @foo?
variable de instancia con nombre, sin embargo, se puede utilizar una variable llamada @foo
y el nombre de la (creada manualmente) getter método foo?
si quería.
mono-parches metaprogramming - tal vez puede ser más elegante, este es sólo un borrador rápido, y no he hecho metaprogramming por un tiempo ...
# inject the convenience method into the definition of the Object class
class Object
def Object::bool_attr(attrname)
class_eval { define_method(attrname.to_s,
lambda { instance_variable_get('@' + attrname.to_s.chop) }) }
class_eval { define_method(attrname.to_s.chop+"=",
lambda { |x| instance_variable_set('@'+attrname.to_s.chop, x) }) }
end
end
### somewhere later
class MyClass
bool_attr :my_boolean_attribute?
def initialize
@my_boolean_attribute = true
end
end
# yet even more later
foo = MyClass.new
bar = MyClass.new
foo.my_boolean_attribute = 1
puts foo.my_boolean_attribute?
puts bar.my_boolean_attribute?
Con este enfoque, que puede ser seca y conseguir el buen signo de interrogación también. Es posible que sólo tenga que elegir un nombre mejor que el " bool_attr ", como: " bool_attr_accessor " o algo similar.
Las definiciones que he hecho son un poco mal humor, en un sentido que el signo de interrogación está presente en el símbolo original. Es probable que un enfoque más limpio sería evitar el signo de interrogación en el nombre del símbolo y añadirlo durante la definición del método -. Debe ser menos confuso
Ah, y casi se olvidó de incluir el enlace obligatorio: Al ver claramente metaclases