/
Evorunner
/
ruby_labs
Обзор
Документация
Войти
/
Evorunner
/
ruby_labs
Код
Запросы
4
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
Lab5
Lab3/student_collection.rb
63 строки
2 KB
Иван
lab-03: ООП, классы Student и StudentCollection
31 май 2026, 17:08
31 май 2026, 17:08
4ab2cb6
Код
Авторство
О чём код?
require_relative "student" class StudentCollection VALID_SKILL_LEVELS = Student::VALID_SKILL_LEVELS def initialize @students = [] end def add(student) @students << student end # Запрашивает данные с консоли, валидирует каждое поле повторно def create_from_input(index) puts "\n--- Студент #{index} ---" name = prompt_until_valid("Имя: ") { |v| !v.strip.empty? } age = prompt_until_valid("Возраст: ", :integer) { |v| v > 0 } gender = prompt_until_valid("Пол (male/female): ") { |v| Student::VALID_GENDERS.include?(v.downcase) } group = prompt_until_valid("Группа: ") { |v| !v.strip.empty? } email = prompt_until_valid("Email: ") { |v| v.match?(Student::EMAIL_REGEX) } skills = {} skills_count = prompt_until_valid("Сколько навыков? ", :integer) { |v| v > 0 } skills_count.times do skill_name = prompt_until_valid(" Название навыка: ") { |v| !v.strip.empty? }.to_sym skill_level = prompt_until_valid( " Уровень (#{VALID_SKILL_LEVELS.join('/')}): " ) { |v| VALID_SKILL_LEVELS.include?(v.downcase) } skills[skill_name] = skill_level end Student.new(name: name, age: age, gender: gender.downcase, group: group, email: email, skills: skills) end def print_all puts "\nСписок студентов" grouped = @students.group_by(&:group) grouped.each do |group, members| puts "\n[#{group}]" members.each_with_index do |student, idx| puts "#{idx + 1}. #{student}" end end end private def prompt_until_valid(prompt, type = :string, &block) loop do print prompt raw = gets.chomp.strip value = type == :integer ? (Integer(raw) rescue nil) : raw if value && block.call(value) return value else puts "Ошибка: введите корректное значение!" end end end end