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 Tesla中如何定义方法函数调用?源代码在哪里?_Elixir - Fatal编程技术网

Elixir Tesla中如何定义方法函数调用?源代码在哪里?

Elixir Tesla中如何定义方法函数调用?源代码在哪里?,elixir,Elixir,我正在查看HTTP客户端包的源代码,并试图找到Tesla.get/2函数的源代码,但在这里找不到它,就像其他HTTP方法的函数一样。顺便说一句,在线文档中的“查看来源”链接也无法打开。我很困惑,有人能解释一下吗 该包使用元编程为每个HTTP谓词生成函数。动词的名称已定义 此列表被迭代,并为每个列表动态生成函数。每个函数的实际主体在generate\u api函数中定义。因此,Tesla.get/2的实际来源是: 如果将方法替换为:get,则可以得到Tesla.get/2的有效定义: def ge

我正在查看HTTP客户端包的源代码,并试图找到Tesla.get/2函数的源代码,但在这里找不到它,就像其他HTTP方法的函数一样。顺便说一句,在线文档中的“查看来源”链接也无法打开。我很困惑,有人能解释一下吗

该包使用元编程为每个HTTP谓词生成函数。动词的名称已定义

此列表被迭代,并为每个列表动态生成函数。每个函数的实际主体在
generate\u api
函数中定义。因此,
Tesla.get/2
的实际来源是:

如果将
方法
替换为
:get
,则可以得到
Tesla.get/2
的有效定义:

def get(url, body) do
  request(method: :get, url: url, body: body)
end

您可以阅读模块代码的已编译Erlang格式,如下所示:

{_, _, bytecode} = :code.get_object_code(Tesla)
{:ok, {_, [{:abstract_code, {_, ac}}]}} = :beam_lib.chunks(bytecode, [:abstract_code])
ac |> :erl_syntax.form_list |> :erl_prettypr.format |> IO.puts
输出是巨大的,但如果仔细观察,您将看到生成的所有
get/2
子句:

...

get(#{'__struct__' := 'Elixir.Tesla.Client'} = _@1,
    _@2) ->
    request(_@1, [{method, get}, {url, _@2}]);
get(_@1, _@2) when erlang:is_function(_@1) ->
    get(#{post => [], pre => [], 'fun' => _@1,
      '__struct__' => 'Elixir.Tesla.Client'},
    _@2);
get(_@1, _@2) when erlang:is_list(_@2) ->
    request([{method, get}, {url, _@1}] ++ _@2).

...
{_, _, bytecode} = :code.get_object_code(Tesla)
{:ok, {_, [{:abstract_code, {_, ac}}]}} = :beam_lib.chunks(bytecode, [:abstract_code])
ac |> :erl_syntax.form_list |> :erl_prettypr.format |> IO.puts
...

get(#{'__struct__' := 'Elixir.Tesla.Client'} = _@1,
    _@2) ->
    request(_@1, [{method, get}, {url, _@2}]);
get(_@1, _@2) when erlang:is_function(_@1) ->
    get(#{post => [], pre => [], 'fun' => _@1,
      '__struct__' => 'Elixir.Tesla.Client'},
    _@2);
get(_@1, _@2) when erlang:is_list(_@2) ->
    request([{method, get}, {url, _@1}] ++ _@2).

...