Поиск…


Синтаксис

  • :условное обозначение
  • :'условное обозначение'
  • :"условное обозначение"
  • «Символ» .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"


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow