@ змінні в Ruby on Rails


294

Яка різниця між @titleі title? Оскільки вони можуть бути іменами змінних. Крім того, як я вирішую, яку змінну я повинен використовувати? З @чи ні?


Я б сказав, що цей підручник є досить акуратним, щоб пояснити все це: techotopia.com/index.php/…
Hearen

Відповіді:


426

title- локальна змінна. Вони існують лише в межах її сфери (поточний блок)

@title є змінною екземпляра - і доступна для всіх методів у класі.

Більше ви можете прочитати тут: http://strugglewithruby.blogspot.dk/2010/03/variables.html

У Ruby on Rails - оголошення ваших змінних у контролері як змінні екземпляра ( @title) робить їх доступними для вашого перегляду.


4
Дякую за відповідь, надайте додаткове запитання ... У класі, над яким я працюю, змінна члена спочатку будується як @options = {...}. Після цього, хоча, методи всередині класу отримують доступ і здійснюють виклики функцій за допомогою цієї змінної, як ніби вони локальні (тобто "options.merge ()"). Це просто погана форма? Чи відбувається якась інша синтаксична магія? (тобто як зробити беззвучний дублікат змінної або зробити його «const», щоб його не можна було змінити тощо)? Я виходжу з точки зору C / C ++ та Java, і справді розпливчастий та необов'язковий синтаксис викликає з мене гайки!
Ден Девін

Чи має ваш клас attr_accessor, визначений тим самим іменем @DanDevine? attr_accessor - синтаксичний цукор, який генерує для вас геттер \ сеттер. Якщо ви отримуєте значення без символу @, код отримує змінну, оскільки він викликає геттера. Зверніть увагу, що це не працює інакше, вам потрібно явно використовувати символ @, якщо ви встановлюєте var, або ж ви просто встановите локальний var. Це гарний стиль? Важко сказати. Я вважаю за краще використовувати синтаксис getter у своїх методах на випадок перекриття getter - я люблю поважати цю інкапсуляцію навіть у самому класі. YMMV
Msencenb

30

Використовуйте @titleу своїх контролерах, коли ви хочете, щоб ваша змінна була доступна у ваших представленнях.

Пояснення полягає в тому, що @titleце змінна інстанція і titleє локальною змінною, і рейли надають змінні екземпляри від контролерів доступними для представлення. Це відбувається тому, що код шаблону (erb, haml тощо) виконується в межах поточного екземпляра контролера.


Дякую за це! Це єдина відповідь, яка пояснює, чому @variables, визначений у класі контролера, можна вибрати за кодом у представленнях.
AlexC

25

Різниця полягає в області застосування змінної. @Version доступний для всіх методів екземпляра класу.

Коротка відповідь, якщо ви перебуваєте в контролері і вам потрібно зробити змінну доступною для перегляду, тоді використовуйте @variable.

Щоб отримати набагато довший відповідь, спробуйте це: http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_classes.html


14

@variables називаються змінними екземпляра в рубіні. Це означає, що ви можете отримати доступ до цих змінних у будь-якому способі всередині класу. [На всіх методах у класі]

Змінні без @символу називаються локальними змінними, а це означає, що ви можете отримати доступ до цих локальних змінних лише в межах ЦЕ ДЕКЛАРОВАНОГО МЕТОДУ. Обмежено місцевим масштабом.

Приклад змінних екземплярів:

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доступні в іншому методі в класі. Але те ж саме не було б доступним для локальних змінних.


9

Підручник про те, що таке змінна область застосування? представляє деякі деталі досить добре, просто додайте тут пов'язані.


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

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

І змінна інстанція є екземпляром selfі починається з @також змінної екземпляра належить самому об'єкту. Змінні інстанції - це ті, які ви виконуєте методами, тобто .sendтощо

приклад:

@user = User.all

@userЄ змінною екземпляра

І неініціалізовані змінні екземпляра мають значення Nil


Тож як це пояснює різницю між @title& title?
Річард Пек

Зі змінною екземпляра, наприклад @title, ви можете виконувати на ній різні методи, тоді як локальна змінна, яку ви не робите,
Джо Хілтон

1
То як це насправді вирішує питання? Схоже, ви просто цитуєте підручник. ОП хоче знати , чи повинен він використовувати @titleабоtitle
Річард Пек

Тож вони повинні використовувати змінну екземпляра, якщо вони хочуть виконати будь-які методи, тобто дефіксувати новий або визначити створення тощо.
Джо Хілтон,

3
Ніщо не заважає вам робити user = User.all та виконувати методи на користувачі, але це не в цьому суть.
Jaro

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.