Ruby: Хеш как последний параметр функции

Одна из идиоматических конструкций в Ruby – функция, принимающая последним параметром хеш. Обычно этот хеш содержит опции. Такое часто встречается и во встроенных функциях, и в библиотеках:

# link_to(body, url, html_options = {})
link_to 'blog', 'https://ru.hexlet.io/blog', { id: 'news', class: 'article' }
# <a href="https://ru.hexlet.io/blog" class="article" id="news">blog</a>

В Ruby добавлен «синтаксический сахар», позволяющий опускать скобки в подобных ситуациях. Вызов выше в реальном коде выглядит так:

link_to 'blog', 'https://ru.hexlet.io/blog', id: 'news', class: 'article'

К такому способу записи нужно немного привыкнуть, так как может быть не сразу понятно, что к чему относится. Но потом станет видно, насколько он удобен и практичен. Это ещё одна из его «фишек», которая помогает строить языки предметной области (DSL). Из-за небольшого количества дополнительного синтаксиса код на Ruby может выглядеть просто, как текст. Ниже пример роутинга (отвечает за формирование адресов страниц сайта) из Rails:

# В большинстве других языков подобная конструкция либо невозможна,
# либо получится в разы сложнее и загроможденнее символами
resources :companies, only: [:show, :edit, :update, :destroy] do
  resources :orders, only: [:create] do
    member do
      get :payment
    end
  end
end

Задание

Реализуйте функцию link_to(), которая генерирует html-ссылки. Функция принимает на вход три параметра:

  • Текст ссылки
  • Сама ссылка
  • Хеш с атрибутами (не обязательный)
link_to 'name', '/url'
# <a href="/url">name</a>

link_to 'name', '/url', class: 'link'
# <a href="/url" class="link">name</a>
Как с вами связаться? 🙃

Команда проекта находится в телеграм-сообществе по ссылке https://ttttt.me/HexletLearningBot. Там можно задать любой вопрос и повлиять на проект

Упражнение не проходит проверку — что делать? 😶

Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "ИИ-помощник". Как правильно задать вопрос:

В моей среде код работает, а здесь нет 🤨

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя 🤔

Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи. В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно 🙄

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в обратной связи нашего сообщества

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются

Привет! Я Тота и моя задача помочь в обучении. Чтобы активировать меня, нужно зарегистрироваться или залогиниться, если у вас уже есть аккаунт

Loading...

Ваше упражнение проверяется по этим тестам

1# frozen_string_literal: true
2
3require 'test_helper'
4require_relative 'index'
5
6describe 'function' do
7  it 'should works' do
8    actual1 = link_to 'name', '/url'
9    expected1 = '<a href="/url">name</a>'
10    assert { actual1 == expected1 }
11
12    actual2 = link_to 'name', '/url', class: 'link'
13    expected2 = '<a href="/url" class="link">name</a>'
14    assert { actual2 == expected2 }
15  end
16end
17

Решение учителя откроется через:

20:00
waiting_clock