Списки символів створюють за допомогою сигіла ~c.
~c"hello"
Звернімо увагу: у старіших версіях Elixir списки символів записуються як 'hello' в одинарних лапках.
Хоча списки символів дуже схожі на рядки тексту (англ. string), ці два типи даних досить різняться між собою. Список символів - це список цілих чисел. Цілі числа представляють значення Unicode заданого символу, які також називають кодовими точками.
[65, 66, 67]
# => ~c"ABC"
Щоб отримати кодову точку символу, поставмо ? перед ним.
?A
# => 65
[?:, ?)]
# => ~c":)"
Оскільки списки символів - це списки, з ними можна працювати так само, як і з будь-яким іншим списком: за допомогою рекурсії та зіставлення зі зразком.
[first_letter | _] = ~c"cat"
first_letter
# => 99
Два списки можна зʼєднати за допомогою ++.
~c"hi" ++ ~c"!"
# => ~c"hi!"
Чим довший перший список, тим повільніше відбувається зʼєднання, тому уникаймо повторного дописування елементів у списки довільної довжини.
casecase - це конструкція керування потоком, яка дозволяє порівнювати задане значення з багатьма зразками. Гілки виразу case обчислюються згори донизу, доки не знайдеться збіг.
age = 15
case age do
0 -> ~c"infant"
age when age < 4 -> ~c"baby"
age when age < 13 -> ~c"child"
age when age < 18 -> ~c"teenager"
_ -> ~c"adult"
end
# => ~c"teenager"
Ми працюємо системним адміністратором у великій компанії в Мюнхені, Німеччина. Одне з наших обовʼязків - керування електронними поштами.
Ми чуємо скарги від людей, які кажуть, що не можуть надіслати листів пану Мюллеру. Швидко стає зрозуміло, що більшість компанії користується старим поштовим клієнтом, який не розпізнає müller@firma.de як дійсну адресу електронної пошти через не-ASCII символ.
Переконувати людей відмовитися від улюбленого старого поштового клієнта - марна справа, тож ми вирішуємо створити очищені псевдоніми для всіх поштових акаунтів.
Реалізуймо функцію sanitize/1. Вона має приймати імʼя користувача як charlist і повертати імʼя користувача, з якого прибрано всі символи, крім малих літер.
Username.sanitize(~c"schmidt1985")
# => ~c"schmidt"
Розширмо функцію sanitize/1. Вона не повинна прибирати підкреслення з імені користувача.
Username.sanitize(~c"mark_fischer$$$")
# => ~c"mark_fischer"
У німецькому алфавіті є 4 не-ASCII символи, і всі вони мають загальновизнані ASCII-відповідники.
| Німецький символ | ASCII-відповідник |
|---|---|
| ä | ae |
| ö | oe |
| ü | ue |
| ß | ss |
Розширмо функцію sanitize/1. Вона має замінювати німецькі символи згідно з таблицею. Можна сміливо припустити, що всі імена користувачів уже записані малими літерами.
Username.sanitize(~c"cäcilie_weiß")
# => ~c"caecilie_weiss"
Зареєструйтеся на Exercism, щоб вивчати й опановувати Elixir, а також 58 концепцій168 вправ та справжнє наставництво від людей, і все це безкоштовно.