2015-02-19 3 views
0

Я пытаюсь перенести свою базу данных в Ruby On Rails приложения, и я немного запутался о правильном синтаксисе показано ниже:Символы против переменных

class CreateCategories < ActiveRecord::Migration 
    def change 
     create_table :categories do |t| 
      t.string :name 
      t.string :thumburl 
      t.timestamps 
     end 
    end 
end 

(1) Почему символ :Migration используется в области имен классов? Способ, которым я его читаю, заключается в создании класса CreateCategories и наследует все атрибуты класса ActiveRecord. Мне учили, что двойной двоеточие означает вызов метода класса, но синтаксическая раскраска заставляет меня думать, что компонент :Migration на самом деле является символом. Что тут происходит?

(2) Я понимаю, что create_table представляет собой метод, но почему использование :categories, т.е. символ, вместо переменной класса или экземпляра, т.е. @@categories или @categories? Я полагаю, вы должны назвать таблицу, которая создается, но почему символ?

(3) Почему :name и :thumburl символы, а не переменные?

ответ

0

(1) Ваш токениз :Migration неправ. Его следует понимать как ::Migration. :: - оператор разрешения области. Это означает, что Migration понимается в пространстве имен ActiveRecord. Вы правы, что :: используется как вызов метода класса. Фактически, :: имеет два вида использования: оператор разрешения области и вызов метода класса; это неоднозначно. Здесь он первый.

(2, 3) @@categories или @categories или любая другая переменная будет оценена до определенного значения, которое она имеет. Это ничего не значит «категория». Чтобы рассказать что-то вроде «категории», выразив его как "category" в строке, или :category, как в символе - это путь.

2

ActiveRecord::Migration не является символом, это имя унаследованного суперкласса. :: - оператор разрешения области, поэтому Migration является членом модуля ActiveRecord.

Что касается символов, которые используются в разных местах, они используются вместо того, чтобы вы могли использовать String, например, указав имя таблицы. Вы можете использовать «категории», но поскольку символы по существу являются лишь указателем на объект, есть определенная величина дополнительной эффективности с точки зрения памяти, так как у вас нет новой строки, создаваемой везде, где используется этот символ.

Чтобы проиллюстрировать эту идею, принять следующий сценарий, например:

puts 'categories'.object_id 
puts 'categories'.object_id 

puts '---------------------' 

puts :categories.object_id 
puts :categories.object_id 

Запуск сценария может производить что-то похожее на это:

19608760 
19608660 
--------------------- 
839388 
839388 

Струнные версии имеют две разные идентификаторы, которые означает, что были созданы два отдельных объекта String. Однако версия символов выводит один и тот же идентификатор, что означает, что для представления символа был создан только один объект, и тот же объект используется везде, где используется символ.

Смежные вопросы