是否有可能实现以下行为,其中一个人试图改变模块属性的值来改变模块方法的行为?
defmodule Adder do
@num_to_add 10
def addTo(input), do: input + @num_to_add
end
IO.inspect Adder.addTo(5) # Prints 15
Adder.num_to_add = 20
IO.inspect Adder.addTo(5) # Expect it to print 25
Run Code Online (Sandbox Code Playgroud)
它抛出错误
** (CompileError) hello.exs:8: cannot invoke remote function Adder.num_to_add/0 inside match
(elixir) src/elixir_clauses.erl:26: :elixir_clauses.match/3
Run Code Online (Sandbox Code Playgroud)
如果这是不可能的(因为Elixir中的所有内容都应该是不可变的),是否有任何Elixir方法可以实现类似的行为.
我发现编译时警告非常有用,但我偶尔可能会错过它们,特别是如果它是在一个测试在CI服务器上运行的pull请求中.
理想情况下,我会在项目组合文件中指定一些会使编译器更严格的内容.
我希望这对所有混合任务都有效,我不想将标志传递给命令,因为这很容易忘记.
例如,对于带有编译器警告的项目,此命令应该失败
mix clean && mix compile
Run Code Online (Sandbox Code Playgroud)
应该是这个
mix clean && mix test
Run Code Online (Sandbox Code Playgroud) 我目前正在Elixir写一个小试飞员.我想使用模式匹配来评估文件是否是规范格式(以"_spec.exs"结尾).有很多关于如何在字符串的开头进行模式匹配的教程,但是这不知道如何在字符串结尾处起作用:
defp filter_spec(file <> "_spec.exs") do
run_spec(file)
end
defp run_spec(file) do
...
end
Run Code Online (Sandbox Code Playgroud)
这总是在编译错误中结束:
== Compilation error on file lib/monitor.ex ==
** (CompileError) lib/monitor.ex:13: a binary field without size is only allowed at the end of a binary pattern
(stdlib) lists.erl:1337: :lists.foreach/2
(stdlib) erl_eval.erl:669: :erl_eval.do_apply/6
Run Code Online (Sandbox Code Playgroud)
那有什么解决方案吗?
我想使用HTTPoison Library在Elixir中执行以下命令.
$ curl -X DELETE -H "expired: 1442395800" -H "signature: ******************" -d '{"api_key":"***************","delete_path":"*******","expired":"****"}' https://cdn.idcfcloud.com/api/v0/caches
{"status":"success","messages":"We accept the cache deleted successfully."}
Run Code Online (Sandbox Code Playgroud)
当我检查的文件如何DELETE在HTTPoison
def delete!(url, headers \\ [], options \\ []), do: request!(:delete, url, "", headers, options)
Run Code Online (Sandbox Code Playgroud)
只有url和header需要.那么我应该把请求体(json体)放在curl哪里?
在Elixir,我试过了
req_body = "{\"api_key\":\"#{api_key}\",\"delete_path\":\"#{delete_path}\",\"expired\":\"#{expired}\"}"
url = "https://cdn.idcfcloud.com/api/v0/caches"
response = HTTPoison.delete!(url, header, [req_body])
Run Code Online (Sandbox Code Playgroud)
但似乎行不通.有人能说出正确的方法吗?
我正在尝试编写一个Plug会对用户进行身份验证(实际检查会话).我无法获得重定向路由.我认为这是因为路由生成在激活此插件后发生.
无论如何我得到这样的错误: undefined function TestApp.page_path/2
在常规背景下,page_path/2显然存在并且有效.
defmodule TestApp.Plugs.Authenticate do
import Plug.Conn
def init(default), do: default
def call(conn, _) do
user = Plug.Conn.get_session(conn, :current_user)
if not is_nil(user) do
assign(conn, :user, user)
else
conn
|> Phoenix.Controller.put_flash(:warning, "User is not authenticated.")
|> Phoenix.Controller.redirect(to: TestApp.page_path(conn, :index))
|> halt
end
end
end
Run Code Online (Sandbox Code Playgroud) 请原谅新手问题,但我发现了许多保护功能插头的例子:
plug :assign_welcome_message, "Hi!" when action in [:index, :show]
Run Code Online (Sandbox Code Playgroud)
但我没有找到如何使用模块插件执行此操作的示例:
plug Guardian.Plug.EnsurePermissions,
handler: Mp.Api.AuthController,
admin: [:dashboard] when action in [:protected_action]
Run Code Online (Sandbox Code Playgroud)
我似乎移动的when action in [:protected_action]任何地方或者给我一个语法错误或一个未定义的函数when/2.我知道我做的事情很愚蠢,但我看不清楚!
救命!
phoenix 1.1.4
因此,在Elixir文档的这一页中,我和一些朋友围绕着一段话进行了对话.
在Elixir中,可以抛出一个值,然后被捕获.throw和catch保留用于无法检索值的情况,除非使用throw和catch.
除非与未提供适当API的库接口,否则这些情况在实践中非常罕见.
哪些情况需要使用try/throw/catchvs. try/rescue?这是为了与一些现有的Erlang库连接吗?页面上的示例显示了Elixir代码,这是我觉得有点混乱.
什么是我应该寻找的"适当的API"?我的意思是这是一个协议吗?
请考虑以下代码:
defmodule T do
def does_not_contain?(s, t) do
s |> not(String.contains?(t))
end
end
Run Code Online (Sandbox Code Playgroud)
这会在编译时出现以下错误:
** (CompileError) iex:3: undefined function not/2
Run Code Online (Sandbox Code Playgroud)
我也试过这样的结构:
defmodule T do
def does_not_contain?(s, t) do
s |> String.contains?(t) |> not
end
end
Run Code Online (Sandbox Code Playgroud)
这给了我这个错误:
** (SyntaxError) iex:4: unexpected token: end
Run Code Online (Sandbox Code Playgroud)
我可以做这样的工作:
defmodule T do
def does_not_contain?(s, t) do
does_contain = s |> String.contains?(t)
not(does_contain)
end
end
Run Code Online (Sandbox Code Playgroud)
但尝试将整个事情保持在管道中是非常有吸引力的.有没有办法在管道中否定一个布尔值?
如何使用插头对凤凰的具体操作.想要使用插件进行某些操作的场景,或者相反,不希望在某些操作中使用插件
我想知道目前使用elixir/phoenix框架的网址,我怎么能得到这个?
编辑#1:
我的nginx配置文件:
server {
client_max_body_size 100M;
listen 80;
server_name *.babysittingbordeaux.dev *.babysittingparis.dev
access_log /usr/local/var/log/nginx/baby-access.log;
error_log /usr/local/var/log/nginx/baby-error.log;
location / {
proxy_pass http://127.0.0.1:4000;
}
}
Run Code Online (Sandbox Code Playgroud)
码:
Atom.to_string(conn.scheme) <> "://" <> (Enum.into(conn.req_headers, %{}) |> Map.get("host")) <> conn.request_path
Run Code Online (Sandbox Code Playgroud)
那个例子返回http://127.0.0.1:4000/,我想得到http://www.babysittingbordeaux.dev/
我正处于开发模式.