@ переменные в Ruby on Rails

294

Какая разница между @titleа title? Поскольку оба они могут быть именами переменных. Кроме того, как мне решить, какую переменную мне следует использовать? С @или нет?

OneZero
источник
Я бы сказал, что этот урок довольно полезен,
Hearen

Ответы:

427

titleявляется локальной переменной. Они существуют только в пределах своей области (текущий блок)

@title является переменной экземпляра и доступна всем методам в классе.

Вы можете прочитать больше здесь: http://strugglingwithruby.blogspot.dk/2010/03/variables.html

В Ruby on Rails - объявление ваших переменных в контроллере как переменных экземпляра ( @title) делает их доступными для вашего просмотра.

Питер Расмуссен
источник
4
Спасибо за ответ, у вас есть дополнительный вопрос ... Внутри класса, над которым я работаю, переменная-член изначально создается как @options = {...}. Однако после этого методы внутри класса обращаются к этой переменной и вызывают ее, как если бы она была локальной (то есть «options.merge ()»). Это просто плохая форма? Есть ли какая-то другая синтаксическая магия? (например, сделать молчаливый dup переменной или сделать его const, чтобы его нельзя было изменить, и т. д.)? Я пришел с точки зрения C / C ++ и Java, и действительно смутный и необязательный синтаксис сводит меня с ума!
Дэн Девайн
Есть ли в вашем классе attr_accessor с тем же именем @DanDevine? attr_accessor - это синтаксический сахар, который генерирует для вас getter \ setter. Если вы получаете значение без символа @, код получает переменную, потому что она вызывает метод получения. Обратите внимание, что это не работает иначе, вам нужно явно использовать символ @, если вы устанавливаете var, иначе вы просто установите локальный var. Это хороший стиль? Тяжело сказать. Я предпочитаю использовать синтаксис getter в моих методах в случае, если getter переопределен - мне нравится соблюдать эту инкапсуляцию, даже внутри самого класса. YMMV
Msencenb
30

Используйте @titleв своих контроллерах, когда вы хотите, чтобы ваша переменная была доступна в ваших представлениях.

Объяснение заключается в том, что @titleэто переменная экземпляра и titleлокальная переменная, а rails делает переменные экземпляра из контроллеров доступными для представлений. Это происходит потому, что код шаблона (erb, haml и т. Д.) Выполняется в рамках текущего экземпляра контроллера.

joscas
источник
Спасибо за это! Это единственный ответ, который объясняет, почему @variables, определенные в классе контроллера, могут быть обнаружены кодом в представлениях.
AlexC
25

Разница заключается в области действия переменной. @Version доступна для всех методов экземпляра класса.

Краткий ответ: если вы находитесь в контроллере и вам нужно сделать переменную доступной для представления, используйте @variable.

Для более длинного ответа попробуйте это: http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_classes.html

GSP
источник
14

@variables называются переменными экземпляра в ruby. Это означает, что вы можете получить доступ к этим переменным в любом методе внутри класса. [По всем методам в классе]

Переменные без @символа называются локальными переменными, что означает, что вы можете получить доступ к этим локальным переменным только в рамках ЗАЯВЛЕННОГО МЕТОДА. Ограничено местным охватом.

Пример переменных экземпляра:

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

В приведенном выше примере @cust_id, @cust_name, @cust_addrдоступны в другом методе в классе. Но то же самое не будет доступно с локальными переменными.

Прабхакар Ундурти
источник
10

Учебник о том, что такое переменная область? Представляет некоторые детали довольно хорошо, просто приложите сюда соответствующие.


+------------------+----------------------+
| 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
источник
4

Локальная переменная доступна только из блока ее инициализации. Также локальная переменная начинается со строчной буквы (az) или подчеркивания (_).

И переменная экземпляра является экземпляром selfи начинается с. @Также переменная экземпляра принадлежит самому объекту. Переменные экземпляра являются те , которые вы выполняете методы т.е. .sendт.д.

пример:

@user = User.all

@userЯвляется переменной экземпляра

И неинициализированные переменные экземпляра имеют значение Nil

Джо Хилтон
источник
Так как же это объяснить разницу между @title& title?
Ричард Пек
С переменной экземпляра как @title вы можете выполнять различные методы на него, в то время как локальная переменная вы не
Джо Hilton
1
Так как же это на самом деле решить вопрос? Похоже, вы просто цитируете какой-то учебник. ОП хочет знать, должен ли он использовать @titleилиtitle
Ричард Пек
Поэтому им следует использовать переменную экземпляра, если они хотят выполнять какие-либо методы, т. Е. Def new или def create и т. Д.
Джо Хилтон,
3
Ничто не мешает вам делать user = User.all и выполнять методы для пользователя, но это не главное.
Jaro