Ruby Language
Символы
Поиск…
Синтаксис
- :условное обозначение
- :'условное обозначение'
- :"условное обозначение"
- «Символ» .to_sym
- % s {символ}
замечания
Преимущества использования символов над строками:
1. Символом Ruby является объект с сопоставлением O (1)
Чтобы сравнить две строки, нам потенциально нужно смотреть на каждого персонажа. Для двух строк длины N это потребует сравнений N + 1
def string_compare str1, str2
if str1.length != str2.length
return false
end
for i in 0...str1.length
return false if str1[i] != str2[i]
end
return true
end
string_compare "foobar", "foobar"
Но так как каждый вид: foobar относится к одному и тому же объекту, мы можем сравнивать символы, просматривая идентификаторы объектов. Мы можем сделать это с помощью одного сравнения. (O (1))
def symbol_compare sym1, sym2
sym1.object_id == sym2.object_id
end
symbol_compare :foobar, :foobar
2. Символом Ruby является метка в перечислении бесплатной формы
В C ++ мы можем использовать «перечисления» для представления семейств связанных констант:
enum BugStatus { OPEN, CLOSED };
BugStatus original_status = OPEN;
BugStatus current_status = CLOSED;
Но поскольку Ruby является динамическим языком, мы не беспокоимся об объявлении типа BugStatus или отслеживании правовых значений. Вместо этого мы представляем значения перечисления в виде символов:
original_status = :open
current_status = :closed
3. Символ Ruby - это постоянное, уникальное имя
В Ruby мы можем изменить содержимое строки:
"foobar"[0] = ?b # "boo"
Но мы не можем изменить содержимое символа:
:foobar[0] = ?b # Raises an error
4. Символом Ruby является ключевое слово для аргумента ключевого слова
При передаче аргументов ключевого слова функции Ruby мы определяем ключевые слова с использованием символов:
# Build a URL for 'bug' using Rails.
url_for :controller => 'bug',
:action => 'show',
:id => bug.id
5. Символ Ruby - отличный выбор для хеш-ключа
Как правило, мы будем использовать символы для представления ключей хэш-таблицы:
options = {}
options[:auto_save] = true
options[:show_comments] = false
Создание символа
Наиболее распространенным способом создания объекта Symbol
является префикс идентификатора строки с двоеточием:
:a_symbol # => :a_symbol
:a_symbol.class # => Symbol
Вот несколько альтернативных способов определения Symbol
в сочетании со String
литералом:
:"a_symbol"
"a_symbol".to_sym
Символы также имеют последовательность %s
, которая поддерживает произвольные разделители, аналогичные тем, как %q
и %Q
работают для строк:
%s(a_symbol)
%s{a_symbol}
%s
особенно полезно для создания символа из ввода, который содержит пробел:
%s{a symbol} # => :"a symbol"
Хотя некоторые интересные символы ( :/
:[]
:^
и т. Д.) Могут быть созданы с определенными идентификаторами строк, обратите внимание, что символы не могут быть созданы с помощью числового идентификатора:
:1 # => syntax error, unexpected tINTEGER, ...
:0.3 # => syntax error, unexpected tFLOAT, ...
Символы могут заканчиваться одним ?
или !
без необходимости использования строкового литерала в качестве идентификатора символа:
:hello? # :"hello?" is not necessary.
:world! # :"world!" is not necessary.
Обратите внимание, что все эти различные методы создания символов возвратят один и тот же объект:
:symbol.object_id == "symbol".to_sym.object_id
:symbol.object_id == %s{symbol}.object_id
Поскольку Ruby 2.0 содержит ярлык для создания массива символов из слов:
%i(numerator denominator) == [:numerator, :denominator]
Преобразование строки в символ
С учетом String
:
s = "something"
существует несколько способов преобразования его в Symbol
:
s.to_sym
# => :something
:"#{s}"
# => :something
Преобразование символа в строку
Учитывая Symbol
:
s = :something
Самый простой способ преобразовать его в String
можно с помощью метода Symbol#to_s
:
s.to_s
# => "something"
Другой способ сделать это - использовать метод Symbol#id2name
который является псевдонимом метода Symbol#to_s
. Но это метод, который уникален для класса Symbol
:
s.id2name
# => "something"