Книга: Программирование на языке Ruby
11.1.14. Классы, содержащие только данные (Struct)
11.1.14. Классы, содержащие только данные (Struct)
Иногда нужно просто сгруппировать взаимосвязанные данные, не определяя никакие специфические методы обработки. Можно для этого создать класс:
class Address
attr_accessor :street, :city, :state
def initialize(street1, city, state)
@street, @city, @state = street, city, state
end
end
books = Address.new("411 Elm St", "Dallas", "TX")
Такое решение годится, но каждый раз прибегать к нему утомительно; к тому же здесь слишком много повторов. Тут-то и приходит на помощь встроенный класс Struct
. Если вспомогательные методы типа attr_accessor
определяют методы доступа к атрибутам, то Struct
определяет целый класс, который может содержать только атрибуты. Такие классы называются структурными шаблонами.
Address = Struct.new("Address", :street, :city, :state)
books = Address.new("411 Elm St", "Dallas", "TX")
Зачем передавать первым параметром конструктора имя создаваемой структуры и присваивать результат константе (в данном случае Address
)?
При вызове Struct.new
для создания нового структурного шаблона на самом деле создается новый класс внутри самого класса Struct
. Этому классу присваивается имя, переданное первым параметром, а остальные параметры становятся именами его атрибутов. При желании к вновь созданному классу можно было бы получить доступ, указав пространство имен Struct
:
Struct.new("Address", :street, :city, :state)
books = Struct::Address.new("411 Elm St", "Dallas", "TX")
Создав структурный шаблон, вы вызываете его метод new для создания новых экземпляров данной конкретной структуры. Необязательно присваивать значения всем атрибутам в конструкторе. Опущенные атрибуты получат значение nil
. После того как структура создана, к ее атрибутам можно обращаться с помощью обычного синтаксиса или указывая их имена в скобках в качестве индекса, как будто структура - это объект класса Hash
. Более подробную информацию о классе Struct
можно найти в любом справочном руководстве (например, на сайте ruby.doc.org).
Кстати, не рекомендуем создавать структуру с именем Tms
, так как уже есть предопределенный класс Struct::Tms
.
- 11.1.1. Применение нескольких конструкторов
- 11.1.2. Создание атрибутов экземпляра
- 11.1.3. Более сложные конструкторы
- 11.1.4. Создание атрибутов и методов уровня класса
- 11.1.5. Наследование суперклассу
- 11.1.6. Опрос класса объекта
- 11.1.7. Проверка объектов на равенство
- 11.1.8. Управление доступом к методам
- 11.1.9. Копирование объектов
- 11.1.10. Метод initialize_copy
- 11.1.11. Метод allocate
- 11.1.12. Модули
- 11.1.13. Трансформация или преобразование объектов
- 11.1.14. Классы, содержащие только данные (Struct)
- 11.1.15. Замораживание объектов
- 9.1. Классы и прототипы
- Достоверные данные
- rc.firewall.txt script structure
- The structure
- Классы сертификатов
- Статические классы
- I. Только представьте!
- Как завершить работу с программой и сохранить данные, с которыми я работал?
- Как переносить данные через USB-брелок («флэшку»)?
- В дисках используется не NTFS, а я хочу защитить свои данные. Как быть?
- На сайтах я читаю только текст и не хочу платить за картинки. Как их отключить?
- При выключении не дождался конца процесса и отключил питание. Теперь при запуске компьютер начинает бесконечно обращатьс...