Elixir笔记(1)

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 Exhilarating(或者更常作为 Interactive Elixir executable 的简称)

C:\>elixir -v
Erlang/OTP 29 [erts-17.0.4] [source] [64-bit] [smp:18:18] [ds:18:18:10] [async-threads:1] [jit:ns]

Elixir 1.20.2 (compiled with Erlang/OTP 29)
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),否则会引发系统崩溃。 布尔值 true 和 false 实际上就是对应的原子 :true 和 :false
  • 字符串:用双引号包裹的,底层是 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

布尔运算

在 Elixir 中,||、&& 和 ! 操作符支持任何类型的数据,其核心规则是:除了 false 和 nil 之外的所有值都视为“真”(Truthy)。

|| (或操作符)

  • 返回第一个为“真”的值
  • 如果所有值都为“假”(false 或 nil),则返回最后一个值。
:apple
iex(2)> false||nil
nil
iex(3)> nil||42
42
iex(4)> 42||true
42
iex(5)> true||42
true

&& (与操作符)

iex(6)> 42 && true
true
iex(7)> true && 42
42
iex(8)> nil && 42
nil
iex(9)> 42 && nil
nil

! (非操作符)

对值的真假性取反,其结果必定是标准的布尔值(true 或 false)。

iex(10)> !42
false
iex(11)> !true
false
iex(12)> !false
true
iex(13)> !nil
true

严格布尔运算符

  • and、or 和 not 这三个操作符被称为严格布尔运算符(Strict Boolean Operators)。它们的第一个参数必须是严格的布尔值(true 或 false),否则程序会直接抛出 ArgumentError 错误。
  • 虽然第一个参数必须是布尔值,但 and 和 or 的第二个参数可以是任何类型。
  • and 运算符:如果第一个参数是 true,它会直接返回第二个参数的原值(无论第二项是不是布尔值
  • or 运算符:如果第一个参数是 false,它同样会直接返回第二个参数的原值
iex(6)> true and 42
42
iex(7)> false or true
true
iex(8)> true or false
true
iex(9)> not true
false
iex(10)> not 42
** (ArgumentError) argument error
    :erlang.not(42)
    iex:10: (file)

nil

在 Elixir 中,nil 是一个非常特殊的安全标志,它在底层和逻辑判定中有以下核心特性:

  • 本质是原子(Atom)在 Elixir 中,nil 实际上是原子 :nil 的语法糖。两者在编译器眼中完全等价
  • 唯二的“假”值之一: Elixir 的逻辑系统中只有 false 和 nil 被视为“假”(Falsy)。其他所有值(包括数字 0、空列表 []、空字符串 "")全部都是“真”(Truthy)。
  • 常用于空值或缺失表示它通常用来表示“没有值”、“空”或“找不到结果”。例如:Map 中找不到键时:Map.get(%{a: 1}, :b)→ nil,关键字列表找不到键时:Keyword.get([a: 1], :b)→ nil
  • 配合 || 设置默认值因为 nil 是假值,Elixir 开发者经常用 || 来为可能为 nil 的变量设置默认值(俗称“短路赋默认值”):
user_input = nil
display_name = user_input || "匿名用户" → "匿名用户"

示例:

iex(13)> !nil
true
iex(14)> nil==:nil
true
iex(15)> is_atom(nil)
true
iex(16)> user_input=nil
nil
iex(17)> result=user_input||"匿名"
"匿名"

== 与 ===

  • 双等号 == 是算术比较,会进行数值自动转换:当比较整数(Integer)和浮点数(Float)时,Elixir 会在后台将它们视为相同的数学数值。
  • 三等号 === 是类型与数值的强校验,数据类型不同会直接返回false
iex(1)> 2==2.0
true
iex(2)> 2===2.0
false

字符串插值和拼接

使用 #{} 操作符进行字符串插值,使用 <> 操作符进行字符串拼接

iex(3)> name="张三"
"张三"
iex(4)> "你好,#{name}"
"你好,张三"
iex(5)> "你好,"<>name
"你好,张三"

正文完
 0
评论(没有评论)