freeCodeCamp/guide/russian/ruby/ruby-symbols/index.md

129 lines
6.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

---
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)