Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
@@current_temp = 70 attr_accessor :atomic_number def Metal.current_temp=(x) @@current_temp = x end def Metal.current_temp @@current_temp end def liquid? @@current_temp >= @melting end def initialize(atnum, melt) @atomic_number = atnum @melting = melt endendaluminum = Metal.new(13, 1236)copper = Metal.new(29, 1982)gold = Metal.new(79, 1948)Metal.current_temp = 1600puts aluminum.liquid? # trueputs copper.liquid? # falseputs gold.liquid? # falseMetal.current_temp = 2100puts aluminum.liquid? # trueputs copper.liquid? # trueputs gold.liquid? # trueЗдесь переменная класса инициализируется до того, как впервые используется в методе класса. Отметим также, что мы можем обратиться к переменной класса из метода экземпляра, но обратиться к переменной экземпляра из метода класса нельзя. Немного подумав, вы поймете, что так и должно быть.
А если попытаться, что произойдет? Что если мы попробуем напечатать атрибут
@atomic_numberMetal.current_tempnilВ том, что на самом деле мы обращаемся вовсе не к переменной экземпляра класса
MetalClassClassМы столкнулись с переменной экземпляра класса (термин заимствован из языка Smalltalk). Дополнительные замечания на эту тему приводятся в разделе 11.2.4.
В листинге 11.4 иллюстрируются все аспекты этой ситуации.
class MyClass SOME_CONST = "alpha" # Константа уровня класса. @@var = "beta" # Переменная класса. @var = "gamma" # Переменная экземпляра класса. def initialize @var = "delta" # Переменная экземпляра. end def mymethod puts SOME_CONST # (Константа класса.) puts @@var # (Переменная класса.) puts @var # (Переменная экземпляра.) end def MyClass.classmeth1 puts SOME_CONST # (Константа класса.) puts @@var # (Переменная класса.) puts @var # (Переменная экземпляра класса.) endenddef MyClass.classmeth2 puts MyClass::SOME_CONST # (Константа класса.) # puts @@var # Ошибка: вне области видимости. puts @var # (Переменная экземпляра класса.)endmyobj = MyClass.newMyClass.classmeth1 # alpha, beta, gammaMyClass.classmeth2 # alpha, gammamyobj.mymethod # alpha, beta, deltaСледует еще сказать, что метод класса можно сделать закрытым, воспользовавшись методом
private_class_methodprivate11.1.5. Наследование суперклассу
Можно унаследовать класс, воспользовавшись символом
<class Boojum < Snark # ...endЭто объявление говорит, что класс
BoojumSnarkSnarkBoojumЯсно, что цель наследования — расширить или специализировать функциональность. Мы хотим получить из общего нечто более специфическое.
Попутно отметим, что во многих языках, например в C++, допускается множественное наследование (МН). В Ruby, как и в Java, и в некоторых других языках, множественного наследования нет, но наличие классов-примесей компенсирует его отсутствие (см. раздел 11.1.12).
Рассмотрим несколько более реалистичный пример. У нас есть класс
PersonStudentОпределим класс
Personclass Person attr_accessor :name, :age, :sex
