Добро пожаловать в последний пост серии « Начало работы с Ruby ».
В предыдущем посте мы рассмотрели написание наших собственных методов. В этом посте мы узнаем все о том, как работают классы: как их создавать, как создавать методы для них и как использовать наследование для сохранения воссозданного поведения.
Классы в буквальном смысле слова являются строительными блоками Ruby — все, что есть в Ruby, является объектом, а классы — это в основном список определений методов, который действует как план для объектов. Классы используются для создания объектов, известных как экземпляры класса. Эти объекты имеют все методы, определенные в классе.
Мы начнем с рассмотрения того, как добавить наши собственные методы во встроенные классы, такие как Strings, Integers и Arrays.
Изменение встроенных классов
Мы уже видели много встроенных методов в таких классах, как String
и Integer
, таких как reverse
и odd?
, Ruby давайте добавим дополнительные методы к этим классам, открыв определение класса. Это можно сделать, введя ключевое слово class
а затем имя класса.
Вот пример открытия класса Integer
для добавления нового метода с именем double
:
class Integer def double self * 2 end end
Обратите внимание, что слово «Integer» начинается с заглавной буквы, что верно для всех имен классов.
Этот новый метод возвращает значение целого числа, которое вызывает метод, умноженное на 2. Ключевое слово self
ссылается на сам объект, в данном случае это целое число, которое вызывает метод. Теперь все целые числа будут иметь этот метод.
Мы можем проверить этот код в IRB. Прежде всего, сохраните приведенный выше код в файле с именем ‘extensions.rb’, а затем загрузите его в IRB, чтобы нам стали доступны дополнительные методы. Для этого перейдите в папку, в которой сохранен файл extensions.rb, а затем запустите IRB, введя irb
в irb
строке терминала. После запуска IRB нам просто нужно набрать следующее:
load './extensions.rb' => true
Теперь мы можем попробовать наш новый метод:
2.double => 4 5.double => 10 12345.double => 24690
Отлично, это работает!
Вы можете добавить новые методы для всех встроенных классов, таких как Strings и Arrays. На самом деле вы можете даже переопределить методы, которые уже существуют. Вот пример, который изменяет поведение reverse
метода в классе String
. Добавьте следующий код в конец файла ‘extensions.rb’:
class String def reverse "no reversing" end end
Как вы можете видеть, открывая класс String, мы переопределяем reverse
метод, чтобы вернуть строку, которая говорит «нет реверсирования». Попробуйте запустить это в IRB — вам нужно сохранить файл extensions.rb, а затем load
его снова, чтобы изменения вступили в силу.
Изменение поведения встроенных методов очень неодобрительно, так как люди ожидают, что методы будут работать определенным образом. Хотя добавление новых методов, которые добавляют больше функциональности, (как правило) считается хорошей вещью Это как исправление обезьяны. В Ruby on Rails есть модуль Active Support, который добавляет множество дополнительных методов в класс String
. Один из новых методов называется pluralize
числом, который возвращает множественную версию строки.
Вот пример подобного метода pluralize
. Добавьте его в конец файла extensions.rb:
class String def pluralize case self when "woman" then "women" when "person" then "people" when "octopus" then "octopi" when "sheep" then "sheep" else self + "s" end end end
Это использует оператор case, чтобы вернуть множественное число некоторых нерегулярных слов, а затем просто ставит ‘s’ в конце для всех остальных. Давайте посмотрим на это в действии в IRB (не забывайте, что вам нужно будет снова загрузить extensions.rb):
octupus.pluralize => octupi book.pluralize => books bus.pluralize => buss
Это ни в коем случае не завершено, как показано в последнем примере. Впрочем, совершенно очевидно, как это можно использовать для добавления некоторых очень полезных функций ко всем строкам.
Создание ваших собственных классов
Мы не просто должны играть с встроенными классами — мы можем создавать свои собственные!
В последних нескольких постах мы имитировали бросок кубика. Давайте создадим класс Die
который можно использовать для создания множества объектов Die. Затем мы можем «бросить» эти кости, чтобы получить случайные числа.
Создайте файл caled dice.rb и добавьте следующий код:
class Die def roll rand(1..6) end end
Любой класс начинается с ключевого слова class
и сопровождается именем класса (всегда с заглавной буквы). Он заканчивается ключевым словом end
. Затем мы добавляем любые методы внутри этого определения класса.
Чтобы создать новый объект Die
, мы используем new
метод класса Die
(не забудьте загрузить файл ‘die.rb’):
die = Die.new => #<Die:0x8e3459c>
Это создает новый объект Die, представленный #<0x8e3459c>
-
>>
- «»
«»
' «»»
><>
'
>>
'
«»
""""""
«»
«» «»
>""><"">
«»
'
>""
>""
-
"">"">""
-
'
>>
«» «»
'
«»
<""""
'
«»»
><"">>"">""
«»»
«" „“
<""
' '
' '
'
'...'
«»