В предыдущей главе мы увидели, что Эликсир предоставляет операторы +
, -
, *
, /
для арифметических операций, а также функции div/2
и rem/2
для целочисленного деления и получения остатка.
Эликсир также предоставляет операторы ++
и --
для манипуляций со списками:
iex> [1, 2, 3] ++ [4, 5, 6]
[1, 2, 3, 4, 5, 6]
iex> [1, 2, 3] -- [2]
[1, 3]
Конкатенация строк выполняется с помощью оператора <>
:
iex> "foo" <> "bar"
"foobar"
Эликсир также предоставляет три логических оператора: or
, and
и not
. Эти операторы строгие в том смысле, что они ожидают логическое значение (true
или false
) в качестве первого аргумента:
iex> true and true
true
iex> false or is_atom(:example)
true
Передача значения другого типа вызовет исключение:
iex> 1 and true
** (BadBooleanError) expected a boolean on left-side of "and", got: 1
Операторы or
и and
являются операторами сокращенного вычисления. Они выполняют правую часть, если левой недостаточно, чтобы определить результат:
iex> false and raise("This error will never be raised")
false
iex> true or raise("This error will never be raised")
true
Обратите внимание. Если вы эрлангист, операторы
and
иor
в Эликсире на самом деле соответствуют операторамandalso
иorelse
из Эрланга.
Кроме этих операторов, Эликсир также предоставляет ||
, &&
и !
, которые принимают аргументы любого типа. Для этих операторов все значения, кроме false
и nil
будут возвращать true
:
# или
iex> 1 || true
1
iex> false || 11
11
# и
iex> nil && 13
nil
iex> true && 17
17
# отрицание
iex> !true
false
iex> !1
false
iex> !nil
true
Подытожим: используйте and
, or
и not
, когда вы ожидаете логические значения. Если любой из аргументов не логического типа, используйте &&
, ||
и !
.
Эликсир также предоставляет операторы сравнения ==
, !=
, ===
, !==
, <=
, >=
, <
, и >
:
iex> 1 == 1
true
iex> 1 != 2
true
iex> 1 < 2
true
Разница между операторами ==
и ===
состоит в том, что последний более строг при сравнении целых и дробных чисел:
iex> 1 == 1.0
true
iex> 1 === 1.0
false
В Эликсире мы можем сравнивать два разных типа данных:
iex> 1 < :atom
true
Причина, по которой мы можем это сделать – прагматизм. Алгоритмам сортировки не нужно беспокоиться о разнице типов при сортировке. Полный порядок сортировки представлен ниже:
number < atom < reference < function < port < pid < tuple < map < list < bitstring
Вам не нужно запоминать этот порядок, достаточно знать, что он существует.
Для получения справочной информации по операторам (и порядку сортировки), перейдите на страницу справки по операторам.
В следующей главе, мы обсудим некоторые базовые функции, приведение типов данных и немного затроним тему управления потоком исполнения.