Enum 模块:提供了超过70个操作枚举类型的函数,不支持元组(Tuple)。
元组在内存中是连续存放的。Elixir 官方之所以不让元组支持 Enum 模块,是因为设计哲学上的定位不同:
- Enum 的定位:处理动态、同质、长度不可预知的数据流(如用户列表、配置项、日志)。
- Tuple 的定位:处理静态、异质、结构固定的数据块。它通常作为函数的局部返回值(如 {:ok, result})。在底层,元组被设计为“通过索引在 O(1) 时间访问”,而不是被用来“一趟一趟低效循环遍历”的。
获取 Enum 模块中所有可以使用的函数及其参数数量,并把它们整齐地打印在屏幕上:
- Enum.info(:functions):获取函数列表,在 Elixir 中,任何编译好的模块都有一个内置的 info/1 函数,当传入参数 :functions 时,它会去反射(Reflect)该模块,并返回一个包含所有公开函数的关键字列表 (Keyword List),每一个元素都是一个二元元组:{:函数名, 参数数量},数据示例:这一步返回的大致数据长这样:[:any?, 1}, {:any?, 2}, {:at, 2}, {:at, 3}, …]
- |> Enum.each(…):开始循环遍历,|> 是管道操作符。它把左边获取到的“二元元组列表”作为第一个参数,喂给右边的 Enum.each/2,Enum.each/2 的职责是:遍历集合中的每一项,触发指定的函数,但不在乎返回值(通常用于打印、写入文件等副作用操作)
- fn({function, arity}) -> … end:这是传给 Enum.each 的匿名函数。这里用到了极其优雅的模式匹配(Pattern Matching),列表里的每一个项都是二元元组。当元组进来时,它直接被拆解(解构)成两个变量,function:绑定函数的名称(原子类型,如 :map),arity:绑定元数(Arity),即该函数接受的参数个数(整数类型,如 2)
- IO.puts "#{function}/#{arity}":格式化输出,IO.puts:负责在屏幕上打印一行文本,#{…}:Elixir 的字符串插值语法。它把函数名和参数个数拼接成符合 Elixir 官方标准的格式——函数名/元数(例如 map/2 表示 map 函数有两个参数)。
- 元数 (Arity):在 Elixir 中,函数名 + 参数个数 才能唯一确定一个函数。Enum.at/2 和 Enum.at/3 在底层被视为两个完全不同的函数。这就是为什么打印出来的格式一定要带上 /#{arity}
匿名函数语法结构:
fn 参数1, 参数2 ->
# 函数体(执行的代码)
# 最后一行的执行结果会自动作为返回值
end
- fn:声明匿名函数的开始。
- ->:分隔参数列表和函数体。
- end:声明匿名函数的结束。
iex(34)> Enum.__info__(:functions) |> Enum.each(fn({function,arity})->IO.puts "#{function}/#{arity}" end)
__in__/2
all?/1
all?/2
any?/1
any?/2
at/2
at/3
chunk/2
chunk/3
chunk/4
chunk_by/2
chunk_every/2
chunk_every/3
chunk_every/4
chunk_while/4
concat/1
concat/2
count/1
count/2
count_until/2
count_until/3
dedup/1
dedup_by/2
drop/2
drop_every/2
drop_while/2
each/2
empty?/1
fetch/2
fetch!/2
filter/2
filter_map/3
find/2
find/3
find_index/2
find_value/2
find_value/3
flat_map/2
flat_map_reduce/3
frequencies/1
frequencies_by/2
group_by/2
group_by/3
intersperse/2
into/2
into/3
join/1
join/2
map/2
map_every/3
map_intersperse/3
map_join/2
map_join/3
map_reduce/3
max/1
max/2
max/3
max_by/2
max_by/3
max_by/4
member?/2
min/1
min/2
min/3
min_by/2
min_by/3
min_by/4
min_max/1
min_max/2
min_max/3
min_max_by/2
min_max_by/3
min_max_by/4
partition/2
product/1
product_by/2
random/1
reduce/2
reduce/3
reduce_while/3
reject/2
reverse/1
reverse/2
reverse_slice/3
scan/2
scan/3
shuffle/1
slice/2
slice/3
slide/3
sort/1
sort/2
sort_by/2
sort_by/3
split/2
split_while/2
split_with/2
sum/1
sum_by/2
take/2
take_every/2
take_random/2
take_while/2
to_list/1
uniq/1
uniq/2
uniq_by/2
unzip/1
with_index/1
with_index/2
zip/1
zip/2
zip_reduce/3
zip_reduce/4
zip_with/2
zip_with/3
:ok
to go
正文完