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

6.3 KiB
Raw Blame History

title localeTitle
Ruby Symbols Символы Ruby

Символы Ruby

Символ выглядит как имя переменной, но имеет префикс двоеточия. Примеры -: action,: line_items. Вам не нужно предварительно объявлять символ, и они гарантированно будут уникальными. Нет необходимости назначать какую-то ценность символу - Ruby позаботится об этом для вас. Ruby также гарантирует, что независимо от того, где он появляется в вашей программе, конкретный символ будет иметь такое же значение.

Кроме того, вы можете рассматривать двоеточие как «вещь с именем» так: id - это «вещь с именем id». Вы также можете думать о: id как о значении переменной id, а plain id - о значении переменной.

Для ex: Таким образом, если Fred является константой в одном контексте, метод в другом и класс в третьем, символ: Fred будет тем же самым объектом во всех трех контекстах.

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

person = {:name => "Philip"} 

Итак, первое, что мы можем сделать, это проверить Символ, чтобы узнать, какой класс он использует:

:hello.class 
 => Symbol 
 
 "hello".class 
 => String 

Таким образом, мы можем видеть, что символы и строки являются экземплярами двух разных объектов.

Вы можете вызвать струноподобные методы , такие как upcase , downcase и capitalize на Символов:

:hello.upcase 
 => :HELLO 
 
 :HELLO.downcase 
 => :hello 
 
 :hello.capitalize 
 => :Hello 

Зачем использовать символ вместо строки?

Итак, если символ - это просто неизменяемая строка, зачем вы его используете и почему в Ruby существует особое различие?

Символы неизменяемы

Во-первых, одна из главных причин, как я упоминал выше, Символы неизменны. Непредвиденные ошибки могут появиться в вашем приложении, когда значение может измениться. Если вам необходимо убедиться, что значение объекта никогда не должно меняться, гораздо безопаснее использовать неизменяемый объект.

Однако, с учетом сказанного, можно сделать строку, неизменяемую в Ruby, вызвав метод freeze :

name = "Philip" 
 => "Philip" 
 
 name.freeze 
 => "Philip" 
 
 name << "Jim" 
 RuntimeError: can't modify frozen String 

Как вы можете видеть в приведенном выше примере, как только вы вызываете метод замораживания в экземпляре String, вы больше не можете его изменять.

Так почему же вы использовали бы Символы вместо строк?

Символы лучше для производительности

Вторая причина, по которой вы используете Symbol над String в определенных ситуациях, состоит в том, что символы намного лучше подходят для производительности.

Например:

philip".object_id 
 => 70288511587360 
 "philip".object_id 
 => 70288504327720 
 
 :philip.object_id 
 => 539368 
 :philip.object_id 
 => 539368 

Когда вы создаете два объекта String с одинаковым значением, эти два объекта рассматриваются как два разных объекта. Когда вы создаете Символ, ссылка на символ всегда будет использовать тот же объект.

Это намного лучше для производительности, потому что один и тот же объект String будет создан и уничтожен снова и снова, когда на самом деле один и тот же объект может быть повторно использован повторно.

Методы общедоступного класса

all_symbols => массив, чтобы переключить источник Возвращает массив всех символов, находящихся в настоящее время в таблице символов 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