@ variables en Ruby on Rails

294

¿Cuál es la diferencia entre @titley title? Dado que ambos pueden ser nombres de variables. Además, ¿cómo decido qué tipo de variable debo usar? Con @o no?

OneZero
fuente
Yo diría que este tutorial es bastante bueno para explicar todo esto: techotopia.com/index.php/…
Hearen

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.

Peter Rasmussen
fuente
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.

joscas
fuente
¡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

GSP
fuente
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.

Prabhakar Undurthi
fuente
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     |
+------------------+----------------------+
Hearen
fuente
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

Joe Hilton
fuente
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