Что делает: это означает в Ruby on Rails?

Я плохо знаком с миром 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)

Спасибо

6
задан Andrew Grimm 8 June 2010 в 23:36
поделиться

4 ответа

Двоеточие перед текстом указывает на символ в Ruby. Символ похож на константу, но это похоже на то, как если бы символ получил уникальное значение (которое вам не важно) в качестве своего постоянного значения.

При использовании в качестве хеш-индекса символы почти (но не в точности) аналогичны использованию строк.

Кроме того, вы можете прочитать «все» из : all , вызвав to_s для символа. Если бы у вас была постоянная переменная ALL , не было бы никакого способа определить, что она означает «все», кроме как найти ее значение. Вот почему вы можете использовать символы в качестве аргументов мета-методов, таких как attr_accessor , attr_reader и т.п.

Возможно, вы захотите прочитать о символах Ruby .

12
ответ дан 8 December 2019 в 17:19
поделиться

: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

1
ответ дан 8 December 2019 в 17:19
поделиться

Не смотрите на символы как на способ экономии памяти. Посмотрите на них, как на указание на то, что строка должна быть неизменной. 13 способов взглянуть на символ рубина дает множество способов взглянуть на символ.

Используя метафору: символы предназначены для тестов с несколькими вариантами ответов, строки - для вопросов для сочинения.

1
ответ дан 8 December 2019 в 17:19
поделиться

Это не имеет ничего общего с Rails, это просто символы Ruby . : all - это символ, который фактически является простой строкой.

0
ответ дан 8 December 2019 в 17:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: