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?

¿Fue útil?

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:

  1. Rubí hace cumplir ciertas convenciones de nomenclatura. Símbolos en Ruby no pueden tener signos de interrogación. Por lo tanto invocaciones de :my_boolean_attribute? tanto fallarán con un NameError Edit:. No es correcta, sólo tiene que utilizar la sintaxis citado para un símbolo, por ejemplo, :"my_attribute?"
  2. 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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top