windows下安装
参考:https://elixir-lang.org/install/
安装erlang到 C:\ErlangOTP,将 C:\ErlangOTP\bin加入系统path: https://www.erlang.org/downloads.html#prebuilt
安装 Elixir Precompiled Packages 到 C:\Elixir,将 C:\Elixir\bin 加入系统path: https://elixir-lang.org/install/
命令行测试: https://elixir.hexdocs.pm/introduction.html
IEx 是 Elixir 语言自带的交互式命令行工具(全称 Interactive Exlixir)
C:\>iex
Erlang/OTP 29 [erts-17.0.3] [source] [64-bit] [smp:6:6] [ds:6:6:10] [async-threads:1] [jit:ns]
Interactive Elixir (1.20.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> 1+1
2
iex(2)>
数据类型
- 整数:没有固定位数限制,只要内存够大,它可以表示无限大的数字
- 浮点数:遵循 IEEE 754 标准的 64 位双精度浮点数。在 Elixir 中,声明浮点数必须带有点号和至少一位小数(例如写 1. 会报错,必须写 1.0)
- 布尔值:只有 true 和 false。在 Elixir 底层,布尔值其实是 Atom(原子)的语法糖,true 实际上就是 :true。除了 false 和 nil 之外的所有值都被视为“真”。
- 原子:名字就是其本身的值。名字相同的原子在内存中只会被存储一次。它的比较操作是 O(1) 的(只比对内存地址,不比对字符串),速度极快。 原子不会被垃圾回收(GC)。BEAM 虚拟机默认上限只有 1,048,576 个原子。高并发系统下,绝对不能将前端用户输入的随机字符串动态转化为原子(禁止使用 String.to_atom/1),否则会引发系统崩溃。
- 字符串:用双引号包裹的,底层是 UTF-8 编码的二进制流(Binaries)
- 列表:底层是单向链表,在头部插入元素([0 | list])是 O(1) 复杂度的,极速;获取列表长度、访问尾部元素、或通过索引访问是 O(N) 复杂度的(需要遍历整个链表);适用于长度动态变化、且频繁在头部追加的数据流(如消息队列、动态订阅的用户进程列表)
- 元组:底层是连续的内存块,通过索引获取元素、获取元组长度都是 O(1) 的,速度极快;修改元组或添加元素会触发整块内存的复制,代价高昂;适合存放长度固定、只读的数据结构。最经典的用法是在模式匹配(Pattern Matching)中作为函数的返回值返回
- Map (映射) —— 最通用的“字典”Map 是标准的键值对(Key-Value)结构,类似于常用语言中的 Dict 或 JSON 对象。底层针对高并发进行了极致优化。当键值对较少时,使用紧凑内存存储;当键值对变多时,会自动升级为 HAMT(哈希阵列映射树)。这使得它的读写和更新操作具有近似 O(1) 的极高效率。
基本算术
除法:
- / 运算符永远返回浮点数,即使能够整除也不例外
- 整数除法:div只保留计算结果的整数部分(向下取整)
- 取余数/模运算:rem,获取除法运算后的余数
iex(2)> 10/2
5.0
iex(3)> div(10,2)
5
iex(4)> div(10,3)
3
iex(5)> div(11,3)
3
iex(6)> rem(11,3)
** (SyntaxError) invalid syntax found on iex:6:9:
error: unexpected token: ")" (column 9, code point U+FF09)
│
6 │ rem(11,3)
│ ^
│
└─ iex:6:9
(iex 1.20.2) lib/iex/server.ex:402: IEx.Server.__parse__/3
(stdlib 8.0.2) io_lib.erl:1649: :io_lib.get_until/4
(kernel 11.0.3) group.erl:407: :group.xterm/3
(stdlib 8.0.2) gen_statem.erl:3741: :gen_statem.loop_state_callback/11
(stdlib 8.0.2) proc_lib.erl:333: :proc_lib.init_p_do_apply/3
iex(6)> rem 11,3
2
2,8,16进制以数字0开头前缀字母(B、O、X),不区分大小写(建议小写)。二进制:0b1010 与 0B1010 完全等价(输出都是十进制 10)。八进制:0o755 与 0O755 完全等价(输出都是十进制 493)。十六进制:0x1F 与 0X1F 完全等价(输出都是十进制 31)。
iex(6)> rem 11,3
2
iex(7)> 0b1010
10
iex(8)> 0o777
511
iex(9)> 0x1F
31
在 Elixir 中,round 和 trunc 是处理浮点数转换为整数时的两个核心内置函数。round —— 四舍五入到最近的整数;trunc —— 直接截断(只保留整数部分)
iex(10)> round(5.6) # 返回整数:6
6
iex(11)> round(5.4) # 返回整数:5
5
iex(12)> round(-5.6) # 返回整数:-6
-6
iex(13)> trunc(5.6) # 返回整数:5
5
iex(14)> trunc(5.4) # 返回整数:5
5
iex(15)> trunc(-5.6) # 返回整数:-5
-5
正文完