Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在elixir中定义匿名函数后显示的数字是多少?_Elixir - Fatal编程技术网

在elixir中定义匿名函数后显示的数字是多少?

在elixir中定义匿名函数后显示的数字是多少?,elixir,Elixir,当您在elixir中定义匿名函数时,会得到如下结果 #功能 我注意到这个数字是基于函数的算术性。所以1 arg函数总是 #功能 两个参数的函数始终是 #功能 三参数函数始终是 #功能 返回的数字是什么?它是如何派生的?该数字由编译器生成的索引和函数的唯一名称组成。请看下面的图片。它包含以下段落: "#Function<#{uniq(fun_info)}/#{fun_info[:arity]} in " <> "#{Inspect.Atom.inspect(mod)}#{ex

当您在elixir中定义匿名函数时,会得到如下结果

#功能

我注意到这个数字是基于函数的算术性。所以1 arg函数总是

#功能

两个参数的函数始终是

#功能

三参数函数始终是

#功能


返回的数字是什么?它是如何派生的?

该数字由编译器生成的索引和函数的唯一名称组成。请看下面的图片。它包含以下段落:

"#Function<#{uniq(fun_info)}/#{fun_info[:arity]} in " <>
  "#{Inspect.Atom.inspect(mod)}#{extract_name(fun_info[:name])}>"
正如您正确观察到的,
/
后面的部分表示算术数<代码>模块和
名称
显示函数的定义位置
new_index
是指向模块函数表的指针,
uniq
是编译器生成的模块哈希值。当您为函数调用
:erlang.fun\u info
时,您将能够识别inspect字符串中的值:

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: [...]]
现在将其与使用
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>
IO.inspect fn->end
IO.inspect fn->结束
IO.inspect fn->结束
#这张照片
#作用
#作用
#作用

这太棒了。我以为小数点后的数字应该是唯一的,但我注意到它们不仅在我的会话中是一样的,而且在我在互联网上遇到的大多数会话中也是一样的,这非常令人惊讶是的,一开始我也很困惑。这是因为
uniq
是模块定义上的一种散列函数,正如您所看到的,在iex中是
:erl_eval
<代码>索引
也将始终是相同的数字,因为每次评估某个内容时,上下文都是相同的,并且计数器从同一点重新开始。
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>
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>