variáveis ​​no Ruby on Rails

294

Qual é a diferença entre @titlee title? Como os dois podem ser nomes de variáveis. Além disso, como decido que tipo de variável devo usar? Com @ou não?

OneZero
fonte
Eu diria que este tutorial é bastante interessante para explicar tudo isso: techotopia.com/index.php/…
Ouvido 27/03

Respostas:

426

titleé uma variável local. Eles só existem dentro do seu escopo (bloco atual)

@title é uma variável de instância - e está disponível para todos os métodos dentro da classe

Você pode ler mais aqui: http://strugglingwithruby.blogspot.dk/2010/03/variables.html

No Ruby on Rails - declarar suas variáveis ​​no seu controlador como variáveis ​​de instância ( @title) as torna disponíveis para sua visualização.

Peter Rasmussen
fonte
4
Obrigado pela resposta, tenha uma pergunta de acompanhamento ... Dentro de uma classe em que estou trabalhando, a variável membro é inicialmente construída como @options = {...}. Depois disso, os métodos dentro da classe acessam e fazem chamadas de função com essa variável como se fosse local (ou seja, "options.merge ()"). Esta é apenas uma forma ruim? Existe alguma outra magia sintática entrando? (ou seja, como fazer dup silencioso de variável ou torná-lo 'const' para que não possa ser modificado, etc.)? Estou vindo de uma perspectiva C / C ++ e Java, e a sintaxe realmente vaga e opcional está me deixando louca!
Dan Devine
Sua classe possui um attr_accessor definido com o mesmo nome @DanDevine? attr_accessor é um açúcar sintático que gera um getter \ setter para você. Se você está obtendo o valor sem o símbolo @, o código recebe a variável porque está chamando o getter. Observe que isso não funciona da outra maneira, você precisa usar explicitamente o símbolo @ se estiver configurando o var ou então apenas definir um var local. Esse é um bom estilo? Difícil de dizer. Prefiro usar a sintaxe getter em meus métodos, caso o getter seja substituído - eu gosto de respeitar esse encapsulamento, mesmo dentro da própria classe. YMMV
Msencenb
30

Use @titleem seus controladores quando quiser que sua variável esteja disponível em suas visualizações.

A explicação é que @titleé uma variável de instância e titleé uma variável local e os trilhos disponibilizam variáveis ​​de instância de controladores para visualizações. Isso acontece porque o código do modelo (erb, haml, etc) é executado dentro do escopo da instância atual do controlador.

joscas
fonte
Obrigado por isso! Esta é a única resposta que explica por que as variáveis ​​@ definidas na classe do controlador podem ser captadas pelo código nas visualizações.
AlexC
25

A diferença está no escopo da variável. A versão @ está disponível para todos os métodos da instância da classe.

A resposta curta, se você estiver no controlador e precisar disponibilizar a variável para a visualização, use @variable.

Para uma resposta muito mais longa, tente o seguinte: http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_classes.html

GSP
fonte
14

@variables são chamados variáveis ​​de instância em ruby. O que significa que você pode acessar essas variáveis ​​em QUALQUER MÉTODO dentro da classe. [Em todos os métodos da classe]

Variáveis ​​sem o @símbolo são chamadas de variáveis ​​locais, o que significa que você pode acessar essas variáveis ​​locais somente dentro DO MÉTODO DECLARADO. Limitado ao escopo local.

Exemplo de variáveis ​​de instância:

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

No exemplo acima @cust_id, @cust_name, @cust_addrsão acedidas num outro método dentro da classe. Mas a mesma coisa não seria acessível com variáveis ​​locais.

Prabhakar Undurthi
fonte
9

Um tutorial sobre O que é escopo variável? apresenta alguns detalhes muito bem, basta incluir os relacionados aqui.


+------------------+----------------------+
| 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
fonte
4

Uma variável local é acessível apenas dentro do bloco de inicialização. Além disso, uma variável local começa com uma letra minúscula (az) ou sublinhado (_).

E a variável de instância é uma instância selfe começa com uma @variável Também uma instância pertence ao próprio objeto. Variáveis ​​de instância são aquelas em que você executa métodos, por exemplo, .sendetc.

exemplo:

@user = User.all

A @useré a variável de instância

E variáveis ​​de instância não inicializadas têm um valor de Nil

Joe Hilton
fonte
Então, como isso explica a diferença entre @title& title?
Richard Peck
Com uma variável de instância como @title você pode executar vários métodos sobre ele, enquanto uma variável local que você não
Joe Hilton
1
Então, como isso realmente resolve a questão? Parece que você está apenas citando algum tutorial. O OP quer saber se ele deve usar @titleoutitle
Richard Peck
Então, eles devem usar uma variável de instância, se eles querem realizar quaisquer métodos Ie def novo ou def criar etc
Joe Hilton
3
Nada impede você de executar user = User.all e executar métodos no usuário, mas esse não é o objetivo.
Jaro