Практические варианты применения
Разбирайте структурированные данные
«Практические варианты применения» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Основы case/in
- Шаблоны массивов и хешей
- Шаблоны find и защитные условия
- Практические варианты применения