无法调用本地内部匹配

时间:2018-02-12 03:44:50

标签: pattern-matching elixir

我有一个简单的模块负责与API通信。为了方便用户,我允许用户通过"短"网址/my/route或完整网址https://api.mysite.com并使用HTTPoison process_url方法处理:

defmodule MyApp.MyApiHandler do
  use HTTPoison.base
  @endpoint = "https://api.mysite.com"

  def process_url(@endpoint <> _path = url), do: url
  def process_url(url), do: @endpoint <> url
end

这完美无缺!以端点开头的网址未经修改,并且没有添加端点。

我遇到的问题是当我尝试将此端点从模块属性移动到在运行时从config读取的方法时:

defmodule MyApp.MyApiHandler do
  use HTTPoison.base

  def process_url(endpoint() <> _path = url), do: url
  def process_url(url), do: endpoint() <> url

  defp endpoint do
    Application.get_env(:MyApp, __MODULE__)[:endpoint]
  end
end

我收到以下错误

lib/my_api_handler.ex: cannot invoke local endpoint/0 inside match, called as endpoint()

我真的更喜欢将此配置存储在配置中(因此我可以根据环境进行更改)。有没有办法在保留匹配的同时做到这一点?

现有的SO question for this error似乎并没有涵盖我的用例(我没有尝试在比赛中分配),但我也可能在那里出错。

3 个答案:

答案 0 :(得分:3)

已发布的两个答案将在编译时获取env变量而不是运行时间,这意味着如果使用.get_image更改该值,该函数将继续使用旧值。我能想到用一个可以在运行时改变的值来实现它的最简单方法是使用Application.put_env

String.starts_with?/2

答案 1 :(得分:2)

您可以将endpoint定义为宏。

,例如,

defmodule Test do
  defmacro endpoint do
    Application.get_env(:MyApp, __MODULE__)[:endpoint]
  end
  def process_url(endpoint() <> _path = url), do: url
  def process_url(url), do: endpoint() <> url
end

答案 2 :(得分:2)

将其放入library(tidyr) df_in %>% separate(y, into = paste0("col", 1:3), sep="[?](?=http)") # x col1 col2 col3 #1 x1 http://example1.com https://example2.com <NA> #2 x2 NA <NA> <NA> #3 x3 http://example3.com?id=1234 https://example4/com http://example6.com #4 x4 http://example5.com <NA> <NA>

module attribute