0Pricing
Ruby Academy · Урок

Практические варианты применения

Разбирайте структурированные данные

«Практические варианты применения» — бесплатный урок Ruby Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Ruby Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Ruby Academy содержит 4 уроков всего.

Почему сопоставление с шаблонами так полезно

Сопоставление с шаблонами особенно хорошо подходит для обработки структурированных данных: ответов API, деревьев конфигурации и разобранных файлов. Оно заменяет вложенные проверки if/dig одним понятным выражением.

require 'json'
resp = JSON.parse('{"ok":true,"data":42}', symbolize_names: true)
case resp
in { ok: true, data: }
  puts(data)
end

Обработка успешных ответов API и ошибок

Сопоставляйте разные формы ответов в отдельных ветках, извлекая нужные поля для каждой из них.

def handle(resp)
  case resp
  in { status: 'ok', result: }
    "got #{result}"
  in { status: 'error', message: }
    "error: #{message}"
  end
end
puts(handle({ status: 'error', message: 'bad input' }))

Разбор аргументов команд

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

def run(args)
  case args
  in ['add', a, b]
    a.to_i + b.to_i
  in ['echo', *rest]
    rest.join(' ')
  end
end
puts(run(['add', '3', '4']))
puts(run(['echo', 'hi', 'there']))

Проверка структуры записи

Используйте шаблон, чтобы убедиться в наличии у записи обязательных полей и типов до начала обработки.

def valid?(rec)
  case rec
  in { name: String, age: Integer => a } if a >= 0
    true
  else
    false
  end
end
puts(valid?({ name: 'Ada', age: 36 }))
puts(valid?({ name: 'X', age: -1 }))

Деконструкция вложенной конфигурации

Извлекайте глубокие значения конфигурации в рамках одного сопоставления вместо цепочки обращений.

cfg = { server: { host: 'localhost', port: 8081 } }
case cfg
in { server: { host:, port: } }
  puts("#{host}:#{port}")
end

Объединения с метками

Распространённый функциональный шаблон: данные помечаются типом, а обработка выбирается по этой метке.

def area(shape)
  case shape
  in { type: 'circle', r: }
    (3.14 * r * r).round(2)
  in { type: 'rect', w:, h: }
    w * h
  end
end
puts(area({ type: 'rect', w: 3, h: 4 }))

Сопоставление с deconstruct

Пользовательские объекты можно сопоставлять, если они определяют deconstruct (для шаблонов массивов). Struct делает это автоматически.

Point = Struct.new(:x, :y)
case Point.new(1, 2)
in [x, y]
  puts("#{x},#{y}")
end

Сопоставление с deconstruct_keys

Определите deconstruct_keys для поддержки шаблонов хэшей. Struct также предоставляет этот метод, обеспечивая сопоставление по именам.

Point = Struct.new(:x, :y)
case Point.new(3, 4)
in { x:, y: }
  puts("x=#{x} y=#{y}")
end

Класс с шаблоном

Объедините шаблон типа с шаблоном хэша, чтобы сопоставить конкретный класс и его поля.

User = Struct.new(:name, :admin, keyword_init: true)
case User.new(name: 'Ada', admin: true)
in User(admin: true, name:)
  puts("#{name} is an admin")
end

Безопасные запасные варианты

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

def parse(data)
  case data
  in { id: Integer => id }
    "id #{id}"
  else
    'unrecognized'
  end
end
puts(parse({ name: 'x' }))

Собираем всё вместе

Реалистичный процесс: разобрать JSON, сопоставить его структуру, проверить её условием-ограничителем и выполнить действие — всё в одном аккуратном выражении.

require 'json'
event = JSON.parse('{"kind":"purchase","amount":150}', symbolize_names: true)
case event
in { kind: 'purchase', amount: Integer => amt } if amt > 100
  puts("big purchase: #{amt}")
in { kind: 'purchase', amount: }
  puts("purchase: #{amount}")
end

Быстрая проверка

Какой метод должен определить пользовательский класс для поддержки сопоставления с хэшем, например in { x:, y: }?

Итоги: практические случаи применения

Вы применили сопоставление с шаблонами к реальным задачам:

  • Распределение ответов API и команд
  • Проверка структуры записи с помощью условий-ограничителей
  • Деконструкция вложенной конфигурации и объединений с метками
  • deconstruct / deconstruct_keys для пользовательских объектов
  • Всегда добавляйте else для безопасной обработки неподходящих данных

Вы завершили курс по сопоставлению с шаблонами в Ruby.

case { type: 'circle', r: 2 }
in { type: 'circle', r: } then puts(3.14 * r * r)
end

Часто задаваемые вопросы

Урок «Практические варианты применения» бесплатный?

Да — полный текст урока «Практические варианты применения» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Ruby Academy, подпишись на CoddyKit PRO. Курс Ruby Academy содержит 4 уроков всего.

Чему я научусь в уроке «Практические варианты применения»?

Разбирайте структурированные данные Ты практикуешь Ruby Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Ruby Academy?

Предыдущий опыт не требуется. Ruby Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Практические варианты применения»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Ruby Academy?

Да. Каждый урок Ruby Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы case/in
  2. Шаблоны массивов и хешей
  3. Шаблоны find и защитные условия
  4. Практические варианты применения
← Назад к Ruby Academy