Я плохо знаком с миром Ruby on Rails и Ruby on Rails. Я прочитал некоторые руководства, но я испытываю некоторые затруднения из-за следующего синтаксиса. Я думаю что использование :condition
синтаксис используется в Ruby для определения атрибута класса с некоторым средством доступа, как:
class Sample
attr_accessor :condition
end
это неявно объявляет метод считывания и метод set для свойства "условия". В то время как я смотрел на некоторый пример кода направляющих, я нашел следующие примеры, которые я не полностью понимаю.
Например:
@post = Post.find(params[:id])
Почему это получает доступ id
атрибут с этим синтаксисом, вместо:
@post = Post.find(params[id])
Или, например:
@posts = Post.find(:all)
:all
константа здесь? В противном случае, что это кодирует действительно средства? Если да, почему следующее не используется:
@posts = Post.find(ALL)
Спасибо
Двоеточие перед текстом указывает на символ в Ruby. Символ похож на константу, но это похоже на то, как если бы символ получил уникальное значение (которое вам не важно) в качестве своего постоянного значения.
При использовании в качестве хеш-индекса символы почти (но не в точности) аналогичны использованию строк.
Кроме того, вы можете прочитать «все» из : all
, вызвав to_s
для символа. Если бы у вас была постоянная переменная ALL
, не было бы никакого способа определить, что она означает «все», кроме как найти ее значение. Вот почему вы можете использовать символы в качестве аргументов мета-методов, таких как attr_accessor
, attr_reader
и т.п.
Возможно, вы захотите прочитать о символах Ruby .
:all
- это символ. Символы - это версия интернированных строк в Ruby. Вы можете думать об этом следующим образом: Существует невидимая глобальная таблица symbols
, которая имеет ключи String
и значения Fixnum
. Любая строка может быть преобразована в символ вызовом .to_sym
, который ищет строку в таблице. Если строка уже находится в таблице, возвращается Fixnum, в противном случае она заносит ее в таблицу и возвращает следующий Fixnum. Из-за этого символы рассматриваются во время выполнения как Fixnum: время сравнения постоянно (в языке Си сравнение символов может выполняться с помощью ==
вместо strcmp
)
Вы можете проверить это, посмотрев на object_id
объектов; когда object_id двух вещей одинаковы, они оба указывают на один и тот же объект.
Вы видите, что можно преобразовать две строки в символы, и они будут иметь одинаковый id объекта:
"all".to_sym.object_id == "all".to_sym.object_id #=> true
"all".to_sym.object_id == :all.object_id #=> true
Но обратное не верно: (каждый вызов Symbol#to_s будет производить совершенно новую строку)
:all.to_s.object_id == :all.to_s.object_id #=> false
Не смотрите на символы как на способ экономии памяти. Посмотрите на них, как на указание на то, что строка должна быть неизменной. 13 способов взглянуть на символ рубина дает множество способов взглянуть на символ.
Используя метафору: символы предназначены для тестов с несколькими вариантами ответов, строки - для вопросов для сочинения.
Это не имеет ничего общего с Rails, это просто символы Ruby . : all
- это символ, который фактически является простой строкой.