@ variables dans Ruby on Rails

294

Quelle est la différence entre @titleet title? Puisque les deux peuvent être des noms de variables. De plus, comment puis-je décider du type de variable à utiliser? Avec @ou pas?

OneZero
la source
Je dirais que ce tutoriel est assez soigné pour expliquer tout cela: techotopia.com/index.php/…
Hearen

Réponses:

427

titleest une variable locale. Ils n'existent que dans sa portée (bloc actuel)

@title est une variable d'instance - et est disponible pour toutes les méthodes de la classe.

Vous pouvez en savoir plus ici: http://strugglingwithruby.blogspot.dk/2010/03/variables.html

Dans Ruby on Rails - déclarer vos variables dans votre contrôleur en tant que variables d'instance ( @title) les rend disponibles pour votre vue.

Peter Rasmussen
la source
4
Merci pour la réponse, posez une question de suivi ... Dans une classe sur laquelle je travaille, la variable membre est initialement construite comme @options = {...}. Après cela, les méthodes de la classe accèdent et effectuent des appels de fonction avec cette variable comme si elle était locale (c'est-à-dire "options.merge ()"). Est-ce juste une mauvaise forme? Existe-t-il une autre magie syntaxique? (c'est-à-dire comme faire dup silencieux de variable, ou le rendre 'const' pour qu'il ne puisse pas être modifié, etc.)? Je viens d'un point de vue C / C ++ et Java, et la syntaxe vraiment vague et facultative me rend fou!
Dan Devine
Votre classe a-t-elle un attr_accessor défini avec le même nom @DanDevine? attr_accessor est un sucre syntaxique qui génère un getter \ setter pour vous. Si vous obtenez la valeur sans le symbole @, le code reçoit la variable car il appelle le getter. Notez que cela ne fonctionne pas dans l'autre sens, vous devez utiliser explicitement le symbole @ si vous définissez la var ou sinon vous allez simplement définir une var locale. Est-ce que c'est un bon style? Dur à dire. Je préfère utiliser la syntaxe getter dans mes méthodes au cas où le getter est surchargé - j'aime respecter cette encapsulation, même au sein de la classe elle-même. YMMV
Msencenb
30

À utiliser @titledans vos contrôleurs lorsque vous souhaitez que votre variable soit disponible dans vos vues.

L'explication est qu'il @titles'agit d'une variable d'instance et d' titleune variable locale et que rails rend les variables d'instance des contrôleurs disponibles pour les vues. Cela se produit car le code du modèle (erb, haml, etc.) est exécuté dans le cadre de l'instance de contrôleur actuelle.

joscas
la source
Merci pour cela! C'est la seule réponse qui explique pourquoi les @variables définies dans la classe contrôleur peuvent être récupérées par le code dans les vues.
AlexC
25

La différence réside dans la portée de la variable. La @version est disponible pour toutes les méthodes de l'instance de classe.

La réponse courte, si vous êtes dans le contrôleur et que vous devez mettre la variable à la disposition de la vue, puis l'utiliser @variable.

Pour une réponse beaucoup plus longue, essayez ceci: http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_classes.html

GSP
la source
14

@variableles s sont appelées variables d'instance dans ruby. Ce qui signifie que vous pouvez accéder à ces variables dans N'IMPORTE QUELLE MÉTHODE à l'intérieur de la classe. [Dans toutes les méthodes de la classe]

Les variables sans le @symbole sont appelées variables locales, ce qui signifie que vous pouvez accéder à ces variables locales uniquement dans cette méthode déclarée. Limité à la portée locale.

Exemple de variables d'instance:

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

Dans l'exemple ci - dessus @cust_id, @cust_name, @cust_addrsont accessibles dans une autre méthode dans la classe. Mais la même chose ne serait pas accessible avec des variables locales.

Prabhakar Undurthi
la source
10

Un tutoriel sur Qu'est-ce que la portée variable? présente assez bien certains détails, il suffit de joindre les informations connexes ici


+------------------+----------------------+
| 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
la source
4

Une variable locale n'est accessible qu'à partir du bloc de son initialisation. Une variable locale commence également par une lettre minuscule (az) ou un trait de soulignement (_).

Et la variable d'instance est une instance de selfet commence par une @également une variable d'instance appartient à l'objet lui-même. Les variables d'instance sont celles sur lesquelles vous effectuez des méthodes, par exemple, .sendetc.

exemple:

@user = User.all

La @userest la variable d'instance

Et les variables d'instance non initialisées ont une valeur de Nil

Joe Hilton
la source
Comment cela explique-t-il la différence entre @title& title?
Richard Peck
Avec une variable d'instance comme @title, vous pouvez effectuer diverses méthodes sur celle-ci, tandis qu'une variable locale vous ne le faites pas
Joe Hilton
1
Alors, comment cela règle-t-il réellement la question? On dirait que vous citez juste un didacticiel. L'OP veut savoir s'il doit utiliser @titleoutitle
Richard Peck
Donc, ils doivent utiliser une variable d'instance s'ils veulent effectuer des méthodes, par exemple, déf nouveau ou déf créer etc
Joe Hilton
3
Rien ne vous empêche de faire user = User.all et d'effectuer des méthodes sur user mais ce n'est pas le point.
Jaro