Veo en las clases de Ruby que algunas personas usan el prefijo _ para definir variables de instancia como @_property mientras que en condiciones normales attr_writer usa el nombre normal como @property para definir variables de instancia.
¿Cuál es el punto de hacer esto y cuál es la diferencia?
El prefijo _ no es una característica del idioma, no hace nada especial, es solo una convención.
En la mayoría de los casos, el desarrollador quiere indicar que una variable no está en uso, por ejemplo, una variable de bloque que no se usa en un bloque. O quieren indicar que la variable es una variable interna de un módulo o gema y que otros no deben leer o modificar esta variable directamente.
Hay 2 respuestas posibles aquí dependiendo del tipo de variable.
Cuando _ se usa para prefijar una variable de instancias (como en su pregunta), generalmente es solo una convención para dejar en claro que esa variable de instancia es un detalle de implementación privado y no debe usarse fuera del alcance actual. Puede encontrarlo especialmente en módulos que se incluirán en algunas otras clases, en cuyo caso la variable de instancia está definida y utilizada por ese módulo, pero pertenece y está dentro del alcance del objeto mismo. Personalmente, prefiero los registros con ámbito de objeto para esto, pero la variable de instancia "privada" es una forma rápida, sucia y popular de hacerlo. Además, el prefijo del nombre de la variable de instancia con _ reduce las posibilidades de conflicto de nombres.
# Library code module SomeExternalLibraryModule def foo @_something ||= SomeExternalLibraryModule::Something.new(self) end end # Application code class User include SomeExternalLibraryModule attr_reader :something # name conflict "avoided"! Phew! def bar @_something.do_sth # "_" means - you'd better know what you're doing here! # There is no guarantee that instance variable will be present in the future release end end Cuando la variable local tiene el prefijo _ , significa que esa variable no se usa en el código. Es especialmente útil cuando se usan iteradores o se consumen otras entradas de elementos múltiples de las que solo está interesado en uno.
Es bastante común ver solo _ como nombre de variable. Tiene un significado un poco especial para el analizador, que es decir explícitamente "No me importa qué es eso". Como tal, es el único nombre de argumento que se permite varias veces en una sola definición:
def foo(_, _, a) a end foo(1,2,3) #=> 3 def bar(a,a,b); end #=> SyntaxErrorSin embargo, esta suele ser la mejor práctica para usar "No me importa" con un nombre, lo que te facilitará la vida en el futuro si realmente decides que necesitas usar otros argumentos:
def foo(_name, _html_options, options) options.delete(:some_option) super end