# Структура

В пролшом уроке мы поняли, что создавая новый класс мы создаем экземпляр класса `Class`, но это не единственный способ создать такой экземпляр. `Struct` позволяем нам создать новый класс прямо во время выполнения нашей программы.

```ruby
# Каждый символ в аргументах это новая переменная
Person = Struct.new(:name, :age, :address)
person = Person.new('John', 23, 'Moscow')
p person # Person(name = John, age = 23, address = Moscow)
puts person.age # 23
```

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

```ruby
Person = Struct.new(:name, :age, :address) do
  def get_full_info
    "I'm #{name}, #{age} y.o. I'm from #{address}"  
  end
end
person = Person.new('John', 23, 'Moscow')
puts person.get_full_info # I'm John, 23 y.o. I'm from Moscow
```

Мы также можем наследоваться от структуры

```ruby
# В данном случае объект Struct заменяет конструктор у класса
class Person < Struct.new(:name, :age, :address)
  def get_full_info
    "I'm #{name}, #{age} y.o. I'm from #{address}"  
  end
end
```

Но все таки не следует делать такое наследование в реальной практике, так как есть аспекты, которые нарушают принципы ООП:

* при создании объекта нашего класса необязательно передавать все аргументы
* Все атрибуты нашего класса будут иметь `public` доступ

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

## Дополнительный материал

* [Еще немного о Struct](https://www.paweldabrowski.com/articles/ruby-struct)
