/
Evorunner
/
ruby_labs
Обзор
Документация
Войти
/
Evorunner
/
ruby_labs
Код
Запросы
4
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
Lab5
Lab4/student.rb
83 строки
3 KB
Иван
lab-04: работа с файлами, GroupManager и StudentRepository
31 май 2026, 17:34
31 май 2026, 17:34
64ef571
Код
Авторство
О чём код?
class Student VALID_GENDERS = %w[male female].freeze VALID_SKILL_LEVELS = %w[beginner intermediate advanced expert].freeze EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i attr_accessor :id, :name, :age, :gender, :group, :email, :skills def initialize(name:, age:, gender:, group:, email:, skills: {}, id: nil) @id = id @name = name @age = age @gender = gender @group = group @email = email @skills = skills end # Валидации def valid_name? = name.is_a?(String) && !name.strip.empty? def valid_age? = age.is_a?(Integer) && age > 0 def valid_gender? = VALID_GENDERS.include?(gender.to_s) def valid_group? = group.is_a?(String) && !group.strip.empty? def valid_email? = email.is_a?(String) && email.match?(EMAIL_REGEX) def valid_skills? return false unless skills.is_a?(Hash) skills.all? { |k, v| !k.to_s.strip.empty? && VALID_SKILL_LEVELS.include?(v) } end def valid? valid_name? && valid_age? && valid_gender? && valid_group? && valid_email? && valid_skills? end def errors errs = [] errs << "Имя не может быть пустым" unless valid_name? errs << "Возраст должен быть положительным целым числом" unless valid_age? errs << "Пол должен быть 'male' или 'female'" unless valid_gender? errs << "Группа не может быть пустой" unless valid_group? errs << "Email некорректен" unless valid_email? errs << "Навыки содержат некорректные данные" unless valid_skills? errs end # Сериализация в строку файла def to_csv skills_str = skills.map { |k, v| "#{k}:#{v}" }.join(";") "#{id},#{name},#{age},#{gender},#{group},#{email},#{skills_str}" end def self.from_csv(line) parts = line.chomp.split(",", 7) id = parts[0].to_i name = parts[1] age = parts[2].to_i gender = parts[3] group = parts[4] email = parts[5] skills_raw = parts[6] || "" skills = skills_raw.split(";").each_with_object({}) do |pair, h| k, v = pair.split(":") h[k.to_sym] = v if k && v end new(id: id, name: name, age: age, gender: gender, group: group, email: email, skills: skills) end # Форматированный вывод def to_s gender_str = gender.to_s == "male" ? "мужской" : "женский" lines = ["[ID: #{id}] #{name}:"] lines << " #{age} лет, #{gender_str}" lines << " #{email}" if skills.any? lines << " Навыки:" skills.each { |skill, level| lines << " #{skill}: #{level}" } end lines.join("\n") end end