Что значит: это значит в Ruby on Rails? - PullRequest
5 голосов
/ 10 мая 2010

Я новичок в мире Ruby и Ruby on Rails. Я прочитал несколько руководств, но у меня есть некоторые проблемы со следующим синтаксисом. Я думаю, что использование синтаксиса :condition используется в Ruby для определения атрибута класса с каким-либо аксессором, например:

class Sample
  attr_accessor :condition
end

, который неявно объявляет метод получения и установки для свойства "условие". Пока я просматривал пример кода на Rails, я нашел следующие примеры, которые я не совсем понимаю.

Например:

@post = Post.find(params[:id])

Почему он обращается к атрибуту id с помощью этого синтаксиса, а не:

@post = Post.find(params[id])


Или, например:

@posts = Post.find(:all) 

Является ли :all константой здесь? Если нет, что на самом деле означает этот код? Если да, то почему не используется следующее:

@posts = Post.find(ALL)

Спасибо

Ответы [ 4 ]

11 голосов
/ 10 мая 2010

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

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

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

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

1 голос
/ 11 мая 2010

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

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

1 голос
/ 10 мая 2010

:all является символом. Символы - версия Ruby внутренних строк . Вы можете думать об этом так: существует невидимая глобальная таблица с именем symbols, которая имеет String ключей и Fixnum значений. Любая строка может быть преобразована в символ путем вызова .to_sym, который ищет строку в таблице. Если строка уже находится в таблице, она возвращает Fixnum, в противном случае она вводит ее в таблицу и возвращает следующий Fixnum. Из-за этого символы обрабатываются во время выполнения как Fixnums: время сравнения является постоянным (на языке C, сравнение символов может быть сделано с == вместо strcmp)

Вы можете убедиться в этом, посмотрев на object_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

0 голосов
/ 10 мая 2010

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

...