Spec-Zone.ru › Elixir 1.16

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

Атомы

Атом — это константа, значение которой является собственным именем. Некоторые другие языки называют их символами. Они часто полезны для перечисления различных значений, таких как:

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:

Примечание: если вы работаете в 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!"

Строки могут содержать символы перевода строки. Вы можете вводить их, используя escape-последовательности:

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 содержит множество функций, которые работают со строками в соответствии со стандартом Юникод:

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 также предоставляет типы данных для выражения коллекций, таких как списки и кортежи, которые мы изучим далее. Когда мы будем говорить о параллелизме и отказоустойчивости через процессы, мы также обсудим порты, идентификаторы процессов и ссылки, но это будет в последующих главах. Давайте продолжим.

← Предыдущая страница Введение
Следующая страница → Списки и кортежи

Скачать версию ePub

Создано с помощью ExDoc (v0.32.2) для программного языка Elixir

© 2012-2024 The Elixir Team
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.16.3/basic-types.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API