Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:
Листинг 11.10. Метод уровня класса accessor_string

сlass MyClass

 class << self

def accessor_string(*names)

names.each do |name|

class_eval <<-EOF

def #{name}

@#{name}.to_s

end

EOF

end

end

 end

 def initialize

@a = [1,2,3]

@b = Time.now

 end

 accessor_string :a, :b

end

о = MyClass.new

puts o.a # 123

puts o.b # Mon Apr 30 23:12:15 CDT 2001

Вы наверняка сможете придумать и другие, более изобретательные применения. Метод

extend
подмешивает к объекту модуль. Методы экземпляра, определенные в модуле, становятся методами экземпляра объекта. Взгляните на листинг 11.11.

Листинг 11.11. Использование метода extend

module Quantifier

 def any?

self.each { |x| return true if yield x }

false

 end

 def all?

self.each { |x| return false if not yield x }

true

 end

end

list = [1, 2, 3, 4, 5]

list.extend(Quantifier)

flag1 = list.any? {|x| x > 5 } # false

flag2 = list.any? {|x| x >= 5 } # true

flag3 = list.all? {|x| x <= 10 } # true

flag4 = list.all? {|x| x % 2 == 0 } # false

В этом примере к массиву

list
подмешаны методы
any?
и
all?
.

11.2.3. Вложенные классы и модули

Классы и модули можно вкладывать друг в друга произвольным образом. Программисты, приступающие к изучению Ruby, могут этого и не знать.

Основная цель данного механизма — упростить управление пространствами имен. Скажем, в класс

File
вложен класс
Stat
. Это помогает «инкапсулировать» класс
Stat
внутри тесно связанного с ним класса, а заодно оставляет возможность в будущем определить класс
Stat
, не конфликтуя с существующим (скажем, для сбора статистики).

Другой пример дает класс

Struct::Tms
. Любая новая структура
Struct
помещается в это пространство имен, не «загрязняя» расположенные выше, a
Tms
— в действительности тоже
Struct
.

Кроме того, вложенный класс можно создавать просто потому, что внешний мир не должен знать о нем или обращаться к нему. Иными словами, можно создавать целые классы, подчиняющиеся тому же принципу «сокрытия данных», которому переменные и методы экземпляра следуют на более низком уровне.

class BugTrackingSystem

 class Bug

#...

 end

 #...

end

# Никто снаружи не знает о классе Bug.

Можно вкладывать класс в модуль, модуль в класс и т.д. Если вы придумаете интересные и изобретательные способы применения этой техники, дайте нам знать.

11.2.4. Создание параметрических классов

Изучи правила, потом нарушай их.

Басё

Предположим, что нужно создать несколько классов, отличающихся только начальными значениями переменных уровня класса. Напомним, что переменная класса обычно инициализируется в самом определении класса.

class Terran

 @@home_planet = "Earth"

 def Terran.home_planet

@@home_planet

 end

 def Terran.home_planet= (x)

@@home_planet = x

 end

 #...

end

Все замечательно, но что если нам нужно определить несколько подобных классов? Новичок подумает: «Ну так я просто определю суперкласс!» (листинг 11.12).

Листинг 11.12. Параметрические классы: неправильное решение

class IntelligentLife # Неправильный способ решения задачи!

 @@home_planet = nil

 def IntelligentLife.home_planet

@@home _planet

 end

 def IntelligentLife.home_planet=(x)

@@home_planet = x

 end

 #...

end

class Terran < IntelligentLife

 @@home_planet = "Earth"

Поделиться:
Популярные книги

Гримуар темного лорда VIII

Грехов Тимофей
8. Гримуар темного лорда
Фантастика:
боевая фантастика
альтернативная история
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Гримуар темного лорда VIII

Компас желаний

Кас Маркус
8. Артефактор
Фантастика:
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Компас желаний

Император Пограничья 7

Астахов Евгений Евгеньевич
7. Император Пограничья
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Император Пограничья 7

Мажор. Дилогия.

Соколов Вячеслав Иванович
Фантастика:
боевая фантастика
8.05
рейтинг книги
Мажор. Дилогия.

Второгодка. Книга 2. Око за око

Ромов Дмитрий
2. Второгодка
Фантастика:
героическая фантастика
альтернативная история
фэнтези
5.00
рейтинг книги
Второгодка. Книга 2. Око за око

Потомок бога

Решетов Евгений Валерьевич
1. Локки
Фантастика:
попаданцы
альтернативная история
аниме
сказочная фантастика
5.00
рейтинг книги
Потомок бога

Офицер империи

Земляной Андрей Борисович
2. Страж [Земляной]
Фантастика:
боевая фантастика
попаданцы
альтернативная история
6.50
рейтинг книги
Офицер империи

Медицинский триллер-2. Компиляция. Книги 1-26

Градова Ирина
Медицинский триллер
Детективы:
триллеры
криминальные детективы
медицинский триллер
5.00
рейтинг книги
Медицинский триллер-2. Компиляция. Книги 1-26

Идеальный мир для Лекаря 20

Сапфир Олег
20. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 20

На цепи

Уваров
1. На цепи
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
На цепи

Княжна попаданка. Последняя из рода

Семина Дия
1. Княжна попаданка. Магическая управа
Фантастика:
попаданцы
альтернативная история
историческое фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Княжна попаданка. Последняя из рода

Барон диктует правила

Ренгач Евгений
4. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон диктует правила

"Фантастика 2025-103". Компиляция. Книги 1-17

Поселягин Владимир Геннадьевич
Фантастика 2025. Компиляция
Фантастика:
боевая фантастика
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Фантастика 2025-103. Компиляция. Книги 1-17

Солнечный корт

Сакавич Нора
4. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Солнечный корт