elixir - 在 elixir 中定义匿名函数后出现的数字是多少?

标签 elixir

当你在 elixir 中定义一个匿名函数时,你会得到这样的结果。
#Function<6.90072148/1 in :erl_eval.expr/5>
我注意到的是这个数字是基于函数的数量。所以 1 arg 函数总是
#Function<6.90072148/1 in :erl_eval.expr/5>
两个 arg 函数总是
#Function<12.90072148/2 in :erl_eval.expr/5>
一个三 arg 函数总是
#Function<18.90072148/3 in :erl_eval.expr/5>
返回的数字是多少,它是如何得出的?

最佳答案

编号由索引和函数的唯一名称组成,由编译器生成。看看implementation of the inspect protocol for functions .它包含这段话:

"#Function<#{uniq(fun_info)}/#{fun_info[:arity]} in " <>
  "#{Inspect.Atom.inspect(mod)}#{extract_name(fun_info[:name])}>"

在哪里 fun_info指上一次调用 :erlang.fun_info 的结果.这大致转换为以下伪代码,其中所有内插值都引用 fun_info 的元素:
"#Function<#{new_index}.#{uniq}/#{arity} in #{module}.#{name}>"

正如您正确观察到的,/ 之后的部分表示元数。 modulename向您展示函数的定义位置。 new_index是指向模块函数表的指针,uniq是编译器生成的模块的哈希值。当您调用 :erlang.fun_info对于函数,您将能够识别检查字符串中的值:
iex> fun = fn x -> x end
#Function<6.90072148/1 in :erl_eval.expr/5>

iex> fun_info = :erlang.fun_info(fun)
[pid: #PID<0.58.0>,
 module: :erl_eval,
 new_index: 6,
 new_uniq: <<171, 204, ...>>,
 index: 6,
 uniq: 90072148,
 name: :"-expr/5-fun-4-",
 arity: 1,
 env: [...]]

uniq 值和索引一起提供了一种唯一标识匿名函数的方法。请注意,在 iex 内部对于您创建的所有函数,这些所谓的唯一值将非常相似,但是当代码“正确”编译时,它们将是唯一的。考虑以下 iex session :
iex> fn -> end
#Function<20.90072148/0 in :erl_eval.expr/5>
iex> fn -> end
#Function<20.90072148/0 in :erl_eval.expr/5>
iex> fn -> end
#Function<20.90072148/0 in :erl_eval.expr/5>

现在将其与使用 elixir fun.exs 运行以下文件进行比较:
IO.inspect fn -> end
IO.inspect fn -> end
IO.inspect fn -> end

# this prints

#Function<0.120576197 in file:fun.exs>
#Function<1.120576197 in file:fun.exs>
#Function<2.120576197 in file:fun.exs>

关于elixir - 在 elixir 中定义匿名函数后出现的数字是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30857264/

相关文章:

mocking - Elixir 中的时间旅行和时间卡住

elixir - 在 Elixir 中,如何在另一个循环中遍历列表?

elixir - 使用 Guardian 创建电子邮件验证 URL

postgresql - docker 容器内的 Ecto.reset 不起作用

elixir - 如何在我的 Elixir 应用程序中找到工作人员?

elixir - 用于关联的变更集函数

dictionary - Elixir 将结构转换为映射

Elixir 数据类型的应用

elixir - 如何获取 map 中的值(value)键?

Elixir:模式匹配特定类型的列表?