我有一个简单的模块负责与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似乎并没有涵盖我的用例(我没有尝试在比赛中分配),但我也可能在那里出错。
答案 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