Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
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, :bendо = MyClass.newputs o.a # 123puts o.b # Mon Apr 30 23:12:15 CDT 2001Вы наверняка сможете придумать и другие, более изобретательные применения. Метод
extendmodule 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 endendlist = [1, 2, 3, 4, 5]list.extend(Quantifier)flag1 = list.any? {|x| x > 5 } # falseflag2 = list.any? {|x| x >= 5 } # trueflag3 = list.all? {|x| x <= 10 } # trueflag4 = list.all? {|x| x % 2 == 0 } # falseВ этом примере к массиву
listany?all?11.2.3. Вложенные классы и модули
Классы и модули можно вкладывать друг в друга произвольным образом. Программисты, приступающие к изучению Ruby, могут этого и не знать.
Основная цель данного механизма — упростить управление пространствами имен. Скажем, в класс
FileStatStatStatДругой пример дает класс
Struct::TmsStructTmsStructКроме того, вложенный класс можно создавать просто потому, что внешний мир не должен знать о нем или обращаться к нему. Иными словами, можно создавать целые классы, подчиняющиеся тому же принципу «сокрытия данных», которому переменные и методы экземпляра следуют на более низком уровне.
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).
class IntelligentLife # Неправильный способ решения задачи! @@home_planet = nil def IntelligentLife.home_planet @@home _planet end def IntelligentLife.home_planet=(x) @@home_planet = x end #...endclass Terran < IntelligentLife @@home_planet = "Earth" #...end
