Статьи

GSwR VI: оставайтесь стильными с Руби

Добро пожаловать в последний пост серии « Начало работы с 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> -

 >> 

- «»

«»

' «»»

 ><> 

'

 >> 

'

«»

 """""" 

«»

«» «»

 >""><""> 

«» '

 >"" 

 >"" 

-

 "">"">"" 

-

'

 >> 

«» «»

'

«»

 <"""" 

'

«»»

 ><"">>"">"" 

«»»

«" „“

 <"" 

' '

' '

'

'

'...'

«»