129 lines
6.3 KiB
Markdown
129 lines
6.3 KiB
Markdown
|
---
|
|||
|
title: Ruby Symbols
|
|||
|
localeTitle: Символы Ruby
|
|||
|
---
|
|||
|
## Символы Ruby
|
|||
|
|
|||
|
Символ выглядит как имя переменной, но имеет префикс двоеточия. Примеры -: action,: line\_items. Вам не нужно предварительно объявлять символ, и они гарантированно будут уникальными. Нет необходимости назначать какую-то ценность символу - Ruby позаботится об этом для вас. Ruby также гарантирует, что независимо от того, где он появляется в вашей программе, конкретный символ будет иметь такое же значение.
|
|||
|
|
|||
|
Кроме того, вы можете рассматривать двоеточие как «вещь с именем» так: id - это «вещь с именем id». Вы также можете думать о: id как о значении переменной id, а plain id - о значении переменной.
|
|||
|
|
|||
|
Для ex: Таким образом, если Fred является константой в одном контексте, метод в другом и класс в третьем, символ: Fred будет тем же самым объектом во всех трех контекстах.
|
|||
|
|
|||
|
```ruby
|
|||
|
module One
|
|||
|
class Fred
|
|||
|
end
|
|||
|
$f1 = :Fred
|
|||
|
end
|
|||
|
module Two
|
|||
|
Fred = 1
|
|||
|
$f2 = :Fred
|
|||
|
end
|
|||
|
def Fred()
|
|||
|
end
|
|||
|
$f3 = :Fred
|
|||
|
$f1.object_id #=> 2514190
|
|||
|
$f2.object_id #=> 2514190
|
|||
|
$f3.object_id #=> 2514190
|
|||
|
```
|
|||
|
|
|||
|
## Работа с символами
|
|||
|
|
|||
|
Вы можете распознать символ Ruby, потому что это будет слово, которое начинается с:.
|
|||
|
|
|||
|
До сих пор мы рассматривали их как ключ в хеше (работа с хэшами в Ruby):
|
|||
|
|
|||
|
```ruby
|
|||
|
person = {:name => "Philip"}
|
|||
|
```
|
|||
|
|
|||
|
Итак, первое, что мы можем сделать, это проверить Символ, чтобы узнать, какой класс он использует:
|
|||
|
|
|||
|
```ruby
|
|||
|
:hello.class
|
|||
|
=> Symbol
|
|||
|
|
|||
|
"hello".class
|
|||
|
=> String
|
|||
|
```
|
|||
|
|
|||
|
Таким образом, мы можем видеть, что символы и строки являются экземплярами двух разных объектов.
|
|||
|
|
|||
|
Вы можете вызвать струноподобные методы , такие как `upcase` , `downcase` и `capitalize` на Символов:
|
|||
|
|
|||
|
```ruby
|
|||
|
:hello.upcase
|
|||
|
=> :HELLO
|
|||
|
|
|||
|
:HELLO.downcase
|
|||
|
=> :hello
|
|||
|
|
|||
|
:hello.capitalize
|
|||
|
=> :Hello
|
|||
|
```
|
|||
|
|
|||
|
## Зачем использовать символ вместо строки?
|
|||
|
|
|||
|
Итак, если символ - это просто неизменяемая строка, зачем вы его используете и почему в Ruby существует особое различие?
|
|||
|
|
|||
|
## Символы неизменяемы
|
|||
|
|
|||
|
Во-первых, одна из главных причин, как я упоминал выше, Символы неизменны. Непредвиденные ошибки могут появиться в вашем приложении, когда значение может измениться. Если вам необходимо убедиться, что значение объекта никогда не должно меняться, гораздо безопаснее использовать неизменяемый объект.
|
|||
|
|
|||
|
Однако, с учетом сказанного, можно сделать строку, неизменяемую в Ruby, вызвав метод `freeze` :
|
|||
|
|
|||
|
```ruby
|
|||
|
name = "Philip"
|
|||
|
=> "Philip"
|
|||
|
|
|||
|
name.freeze
|
|||
|
=> "Philip"
|
|||
|
|
|||
|
name << "Jim"
|
|||
|
RuntimeError: can't modify frozen String
|
|||
|
```
|
|||
|
|
|||
|
Как вы можете видеть в приведенном выше примере, как только вы вызываете метод замораживания в экземпляре String, вы больше не можете его изменять.
|
|||
|
|
|||
|
Так почему же вы использовали бы Символы вместо строк?
|
|||
|
|
|||
|
#### Символы лучше для производительности
|
|||
|
|
|||
|
Вторая причина, по которой вы используете Symbol над String в определенных ситуациях, состоит в том, что символы намного лучше подходят для производительности.
|
|||
|
|
|||
|
Например:
|
|||
|
|
|||
|
```ruby
|
|||
|
philip".object_id
|
|||
|
=> 70288511587360
|
|||
|
"philip".object_id
|
|||
|
=> 70288504327720
|
|||
|
|
|||
|
:philip.object_id
|
|||
|
=> 539368
|
|||
|
:philip.object_id
|
|||
|
=> 539368
|
|||
|
```
|
|||
|
|
|||
|
Когда вы создаете два объекта String с одинаковым значением, эти два объекта рассматриваются как два разных объекта. Когда вы создаете Символ, ссылка на символ всегда будет использовать тот же объект.
|
|||
|
|
|||
|
Это намного лучше для производительности, потому что один и тот же объект String будет создан и уничтожен снова и снова, когда на самом деле один и тот же объект может быть повторно использован повторно.
|
|||
|
|
|||
|
#### Методы общедоступного класса
|
|||
|
|
|||
|
all\_symbols => массив, чтобы переключить источник Возвращает массив всех символов, находящихся в настоящее время в таблице символов Ruby.
|
|||
|
|
|||
|
```ruby
|
|||
|
Symbol.all_symbols.size #=> 903
|
|||
|
Symbol.all_symbols[1,20] #=> [:floor, :ARGV, :Binding, :symlink,
|
|||
|
:chown, :EOFError, :$;, :String,
|
|||
|
:LOCK_SH, :"setuid?", :$<,
|
|||
|
:default_proc, :compact, :extend,
|
|||
|
:Tms, :getwd, :$=, :ThreadGroup,
|
|||
|
:wait2, :$>]
|
|||
|
```
|
|||
|
|
|||
|
#### Дополнительная информация:
|
|||
|
|
|||
|
[Документация по Ruby Symbols](http://ruby-doc.org/core-2.5.1/Symbol.html)
|