Elixir: Строки

В эликсир есть два вида строк. Строки в одинарных кавычках представляют собой последовательность Unicode символов, где каждый символ представлен 32-х разрядным числом. То есть, он занимает 4 байта. Такие строки используются нечасто.

Гораздо чаще используются строки в двойных кавычках, которые представляют собой бинарные данные в формате UTF-8. В этом формате символы латинского алфавита занимают 1 байт, символы кириллицы занимают 2 байта, а символы других алфавитов занимают от 1 до 4-х байт. То есть, такая строка занимает значительно меньше памяти.

Для склеивания двух строк применяется оператор <>:

"Hello" <> " " <> "World!"  # "Hello World!"

Модуль String из стандартной библиотеки содержит функции для работы со строками. Например, функцию для определения длины строки String.length(my_str), функцию для разбиения строки на части String.split(my_str, separator) функцию для удаления пробельных символов String.trim(my_str) и еще несколько десятков функций.

Одна из операций над строками, которая на первый взгляд кажется простой, это перевод строки в верхний или нижний регистр. На самом деле для некоторых алфавитов эта операция должна учитывать контекст, а не просто один символ. А для некоторых других алфавитов она не имеет смысла.

Функция String.upcase(str, mode) работает в трех разных режимах. В режиме :default она переводит в верхний регистр все символы, для которых это возможно. В режиме :ascii она переводит только символы латинского алфавита:

String.upcase("hello мир!", :default) # "HELLO МИР!"
String.upcase("hello мир!", :ascii) # "HELLO мир!"

Третий режим -- :greek используется для греческого алфавита, где, как раз, эта операция зависит от контекста.

Задание

Реализуйте функцию join_and_upcase, которая принимает две строки, соединяет их вместе, удаляет пробелы в начале и в конце, и переводит в верхний регистр только символы латинского алфавита.

Solution.join_and_upcase(" привет ", "world!")
# => "привет WORLD!"

Solution.join_and_upcase("hello ", "мир!  ")
# => "HELLO мир!"

Полезное

Как с вами связаться? 🙃

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

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

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

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

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

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

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

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

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

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

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

Loading...

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

1defmodule Test do
2  use ExUnit.Case
3
4  test "join and upcase works" do
5    res = Solution.join_and_upcase(" привет ", "world!")
6    assert res == "привет WORLD!"
7
8    res = Solution.join_and_upcase("hello ", "мир!  ")
9    assert res == "HELLO мир!"
10
11    res = Solution.join_and_upcase("   hello ", "world!  ")
12    assert res == "HELLO WORLD!"
13  end
14end
15

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

20:00
waiting_clock