Source Основные типы данных
В этой главе мы узнаем больше об основных типах данных Elixir: целых числах, числах с плавающей точкой, булевых значениях, атомах и строках. Другие типы данных, такие как списки и кортежи, будут рассмотрены в следующей главе.
iex> 1 # integer
iex> 0x1F # integer
iex> 1.0 # float
iex> true # boolean
iex> :atom # atom / symbol
iex> "elixir" # string
iex> [1, 2, 3] # list
iex> {1, 2, 3} # tuple
Основные арифметические операции
Откройте iex и введите следующие выражения:
iex> 1 + 2 3 iex> 5 * 5 25 iex> 10 / 2 5.0
Обратите внимание, что 10 / 2 вернуло число с плавающей точкой 5.0 вместо целого числа 5. Это ожидаемо. В Elixir оператор / всегда возвращает число с плавающей точкой. Если вам нужно выполнить целочисленное деление или получить остаток от деления, вы можете вызвать функции div и rem.
iex> div(10, 2) 5 iex> div 10, 2 5 iex> rem 10, 3 1
Обратите внимание, что Elixir позволяет опускать скобки при вызове функций, которые ожидают один или несколько аргументов. Эта функция обеспечивает более чистый синтаксис при написании объявлений и конструкций управления потоком. Однако разработчики Elixir обычно предпочитают использовать скобки.
Elixir также поддерживает сокращённые записи для ввода двоичных, восьмеричных и шестнадцатеричных чисел:
iex> 0b1010 10 iex> 0o777 511 iex> 0x1F 31
Числа с плавающей точкой требуют точки, за которой следует хотя бы одна цифра, и также поддерживают e для научной записи:
iex> 1.0 1.0 iex> 1.0e-10 1.0e-10
Числа с плавающей точкой в Elixir имеют 64-битную точность.
Вы можете вызвать функцию round для получения ближайшего целого числа к заданному числу с плавающей точкой или функцию trunc для получения целой части числа с плавающей точкой.
iex> round(3.58) 4 iex> trunc(3.58) 3
Наконец, при работе с разными типами данных, мы узнаем, что Elixir предоставляет несколько предикатных функций для проверки типа значения. Например, функция is_integer может использоваться для проверки, является ли значение целым числом или нет:
iex> is_integer(1) true iex> is_integer(2.0) false
Вы также можете использовать is_float или is_number для проверки, соответственно, является ли аргумент числом с плавающей точкой или целым числом или числом с плавающей точкой.
Идентификация функций и документация
Прежде чем перейти к следующему типу данных, давайте поговорим о том, как Elixir идентифицирует функции.
Функции в Elixir идентифицируются по имени и арности. Арность функции описывает количество аргументов, которые принимает функция. С этого момента мы будем использовать и имя функции, и её арность для описания функций в документации. trunc/1 идентифицирует функцию с именем trunc и принимающую 1 аргумент, тогда как trunc/2 идентифицирует другую (несуществующую) функцию с тем же именем, но с арностью 2.
Мы также можем использовать этот синтаксис для доступа к документации. Оболочка Elixir определяет функцию h, которую вы можете использовать для доступа к документации любой функции. Например, ввод h trunc/1 выведет документацию для функции trunc/1:
iex> h trunc/1
def trunc()
Returns the integer part of number.
h trunc/1 работает, потому что она определена в модуле Kernel. Все функции модуля Kernel автоматически импортируются в наш пространство имён. Чаще всего вы также будете включать имя модуля при поиске документации для данной функции:
iex> h Kernel.trunc/1
def trunc()
Returns the integer part of number.
Вы можете использовать имя модуля и имя функции для поиска чего угодно, включая операторы (попробуйте h Kernel.+/2). Вызов h без аргументов отобразит документацию для IEx.Helpers, где определены h и другие функции.
Булевы значения и nil
Elixir поддерживает true и false в качестве булевых значений:
iex> true true iex> true == false false
Elixir также предоставляет три логических оператора: or/2, and/2 и not/1. Эти операторы строго требуют, чтобы первый аргумент был значением, которое оценивается как булево (true или false):
iex> true and true true iex> false or is_boolean(true) 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
Elixir также предоставляет понятие nil, чтобы указать отсутствие значения, и набор логических операторов, которые также работают с nil: ||/2, &&/2 и !/1. Для этих операторов, false и nil считаются «ложными», все остальные значения — «истинными»:
# or iex> 1 || true 1 iex> false || 11 11 # and iex> nil && 13 nil iex> true && 17 17 # not iex> !true false iex> !1 false iex> !nil true
Аналогично, значения, такие как 0 и "", которые в некоторых других языках программирования считаются «ложными», также являются «истинными» в Elixir.
Атомы
Атом — это константа, значение которой равно её имени. Некоторые другие языки называют их символами. Они часто полезны для перечисления отдельных значений, например:
iex> :apple :apple iex> :orange :orange iex> :watermelon :watermelon
Атомы равны, если их имена равны.
iex> :apple == :apple true iex> :apple == :orange false
Часто они используются для выражения состояния операции, используя значения, такие как :ok и :error.
Булевы значения true и false также являются атомами:
iex> true == :true true iex> is_atom(false) true iex> is_boolean(:false) true
Elixir позволяет опускать ведущие : для атомов false, true и nil.
Строки
Строки в Elixir ограничены двойными кавычками и закодированы в UTF-8:
iex> "hellö" "hellö"
Примечание: если вы работаете в Windows, существует вероятность, что ваша консоль по умолчанию не использует UTF-8. Вы можете изменить кодировку текущего сеанса, выполнив
chcp 65001перед вводом в IEx.
Вы можете конкатенировать две строки с помощью оператора <>/2:
iex> "hello " <> "world!" "hello world!"
Elixir также поддерживает интерполяцию строк:
iex> string = "world"
iex> "hello #{string}!"
"hello world!"
Конкатенация строк требует, чтобы обе стороны были строками, но интерполяция поддерживает любой тип данных, который можно преобразовать в строку:
iex> number = 42
iex> "i am #{number} years old!"
"i am 42 years old!"
Строки могут содержать символы перевода строки. Вы можете ввести их с помощью управляющих последовательностей:
iex> "hello ...> world" "hello\nworld" iex> "hello\nworld" "hello\nworld"
Вы можете вывести строку, используя функцию IO.puts/1 из модуля IO:
iex> IO.puts("hello\nworld")
hello
world
:ok
Обратите внимание, что функция IO.puts/1 возвращает атом :ok после вывода.
В Elixir строки представляются внутренне непрерывными последовательностями байтов, известными как бинарные данные:
iex> is_binary("hellö")
true
Мы также можем получить количество байтов в строке:
iex> byte_size("hellö")
6
Обратите внимание, что количество байтов в этой строке равно 6, хотя в ней есть 5 графем. Это связано с тем, что графема «ö» занимает 2 байта для представления в UTF-8. Мы можем получить фактическую длину строки, основанную на количестве графем, используя функцию String.length/1:
iex> String.length("hellö")
5
Модуль String содержит набор функций, которые работают со строками в соответствии с Unicode-стандартом:
iex> String.upcase("hellö")
"HELLÖ"
Структурное сравнение
Elixir также предоставляет ==, !=, <=, >=, < и > как операторы сравнения. Мы можем сравнивать числа:
iex> 1 == 1 true iex> 1 != 2 true iex> 1 < 2 true
Но также атомы, строки, булевы значения и т. д.:
iex> "foo" == "foo" true iex> "foo" == "bar" false
Целые числа и числа с плавающей точкой сравниваются одинаково, если имеют одинаковое значение:
iex> 1 == 1.0 true iex> 1 == 2.0 false
Однако вы можете использовать оператор строгого сравнения === и !==, если хотите различать целые числа и числа с плавающей точкой (в этом разница между этими операторами):
iex> 1 === 1.0 false
Операторы сравнения в Elixir могут сравнивать любые типы данных. Мы говорим, что эти операторы выполняют структурное сравнение. Более подробную информацию можно найти в нашей документации по Структурное и семантическое сравнение.
Elixir также предоставляет типы данных для выражения коллекций, таких как списки и кортежи, которые мы изучим дальше. Когда мы будем говорить о параллелизме и отказоустойчивости с помощью процессов, мы также обсудим порты, идентификаторы процессов и ссылки, но это будет в следующих главах. Перейдём к следующей теме.
© 2012-2024 The Elixir Team
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.17.2/basic-types.html