@ variables en Ruby on Rails


Respuestas:


427

titlees una variable local Solo existen dentro de su alcance (bloque actual)

@title es una variable de instancia y está disponible para todos los métodos dentro de la clase.

Puede leer más aquí: http://strugglingwithruby.blogspot.dk/2010/03/variables.html

En Ruby on Rails: declarar sus variables en su controlador como variables de instancia ( @title) las pone a su disposición.


44
Gracias por la respuesta, tenga una pregunta de seguimiento ... Dentro de una clase en la que estoy trabajando, la variable miembro se construye inicialmente como @options = {...}. Sin embargo, después de esto, los métodos dentro de la clase acceden y realizan llamadas a funciones con esa variable como si fuera local (es decir, "options.merge ()"). ¿Es esta simplemente una mala forma? ¿Hay alguna otra magia sintáctica entrando? (es decir, como hacer una duplicación silenciosa de la variable, o hacerla 'constante' para que no se pueda modificar, etc.)? ¡Vengo desde una perspectiva C / C ++ y Java, y la sintaxis realmente vaga y opcional me está volviendo loco!
Dan Devine

¿Tiene su clase un attr_accessor definido con el mismo nombre @DanDevine? attr_accessor es azúcar sintáctico que genera un getter \ setter para usted. Si obtiene el valor sin el símbolo @, el código recibe la variable porque está llamando al captador. Tenga en cuenta que esto no funciona de la otra manera, debe usar explícitamente el símbolo @ si está configurando la variable o de lo contrario solo establecerá una variable local. ¿Es este buen estilo? Difícil de decir. Prefiero usar la sintaxis getter en mis métodos en caso de que el getter sea anulado; me gusta respetar esa encapsulación, incluso dentro de la clase misma. YMMV
Msencenb

30

Úselo @titleen sus controladores cuando desee que su variable esté disponible en sus vistas.

La explicación es que @titlees una variable de instancia y titlees una variable local y rails hace que las variables de instancia de los controladores estén disponibles para las vistas. Esto sucede porque el código de plantilla (erb, haml, etc.) se ejecuta dentro del alcance de la instancia del controlador actual.


¡Gracias por esto! Esta es la única respuesta que explica por qué las variables definidas en la clase de controlador pueden ser recogidas por código en las vistas.
AlexC

25

La diferencia está en el alcance de la variable. @Version está disponible para todos los métodos de la instancia de clase.

La respuesta corta, si está en el controlador y necesita hacer que la variable esté disponible para la vista, utilice @variable.

Para obtener una respuesta mucho más larga, intente esto: http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_classes.html


14

@variables se llaman variables de instancia en ruby. Lo que significa que puede acceder a estas variables en CUALQUIER MÉTODO dentro de la clase. [En todos los métodos de la clase]

Las variables sin el @símbolo se llaman variables locales, lo que significa que puede acceder a estas variables locales solo dentro de ESE MÉTODO DECLARADO. Limitado al alcance local.

Ejemplo de variables de instancia:

class Customer
  def initialize(id, name, addr)
    @cust_id = id
    @cust_name = name
    @cust_addr = addr
  end

  def display_details
    puts "Customer id #{@cust_id}"
    puts "Customer name #{@cust_name}"
    puts "Customer address #{@cust_addr}"
  end
end

En el ejemplo anterior @cust_id, @cust_name, @cust_addrse accede en otro método dentro de la clase. Pero lo mismo no sería accesible con variables locales.


10

Un tutorial sobre ¿Qué es el alcance variable? presenta algunos detalles bastante bien, solo adjunte lo relacionado aquí.


+------------------+----------------------+
| Name Begins With |    Variable Scope    |
+------------------+----------------------+
| $                | A global variable    |
| @                | An instance variable |
| [a-z] or _       | A local variable     |
| [A-Z]            | A constant           |
| @@               | A class variable     |
+------------------+----------------------+

4

Solo se puede acceder a una variable local desde el bloque de su inicialización. También una variable local comienza con una letra minúscula (az) o un guión bajo (_).

Y la variable de instancia es una instancia de selfy comienza con una @También una variable de instancia pertenece al objeto mismo. Las variables de instancia son aquellas en las que realiza métodos, es decir, .sendetc.

ejemplo:

@user = User.all

El @useres la variable de instancia

Y las variables de instancia no inicializadas tienen un valor de Nil


Entonces, ¿cómo explica esto la diferencia entre @title& title?
Richard Peck

Con una variable de instancia como @title puede realizar varios métodos en ella, mientras que una variable local no lo hace
Joe Hilton

1
Entonces, ¿cómo soluciona eso realmente la pregunta? Parece que solo estás citando algún tutorial. El OP quiere saber si debe usar @titleotitle
Richard Peck

Por lo tanto, deberían usar una variable de instancia si desean realizar algún método, es decir, def nuevo o def crear, etc.
Joe Hilton

3
Nada le impide hacer user = User.all y realizar métodos en user pero este no es el punto.
Jaro

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.