我发现Kernel.apply/3它允许通过将方法指定为原子来动态调用模块中的公共方法,例如result = apply(__MODULE__, :my_method, [arg])转换为result = my_method(arg)
困扰我的是一种称私人方法的方法; 给出这样的代码:
defmodule MyModule do
def do_priv(atom, args) when is_list(args) do
apply(__MODULE__, atom, args)
end
# (change defp => def, and this all works)
defp something_private(arg), do: arg #or whatever
end
Run Code Online (Sandbox Code Playgroud)
我希望这MyModule.do_priv(:something_private, [1])是允许的,因为它是从模块内部调用私有方法.我可以理解,引擎盖Elixir正在使用Erlang的apply/3,所以这种方法可能不会让我们在那里.
我也试过使用这个Code.eval_quoted/3方法,但它似乎甚至没有能够调用硬编码的私有方法(因此没有时间花在手上构建AST,而不是quote do像下面那样使用 - 尽管如果有人看到这是一个选项如何使这项工作):
defmodule MyModule do
def do_priv_static do
something_private(1) #this works just fine
end
def do_priv_dynamic do
code = quote do
something_private(1)
end
Code.eval_quoted(code, [], __ENV__) #nope. …Run Code Online (Sandbox Code Playgroud) 我正在关注Plugs上的Phoenix Guide来创建我自己的插件来Module Plug加载当前用户.在@user当使用插件模块没有被分配,但是当我把它作为一个内部私有函数工作正常router.ex.
这是我的web/router:
defmodule MyApp.Router do
use MyApp.Web, :router
pipeline :browser do
plug :accepts, ["html"]
plug :fetch_session
plug :fetch_flash
plug :protect_from_forgery
plug MyApp.Plugs.User
end
# Scopes and Routes...
end
Run Code Online (Sandbox Code Playgroud)
这是我的模块(in web/plugs/user.ex):
defmodule MyApp.Plugs.User do
import Plug.Conn
def init(default), do: default
def call(conn, default) do
user = %{
id: get_session(conn, :user_id),
username: get_session(conn, :username)
}
assign(conn, :user, user)
IO.inspect conn
end
end
Run Code Online (Sandbox Code Playgroud)
我试过检查它是否真的被分配,但它不是:
%Plug.Conn{adapter: {Plug.Adapters.Cowboy.Conn, …Run Code Online (Sandbox Code Playgroud) 我有一个凤凰频道推出了大约4KB的数据,很多都是高度重复的,并且想知道是否有办法打开该频道的压缩.
如果我正在使用凤凰控制器,它看起来相当简单,但我无法确定这是否可行或在某个地方为某个频道记录.
谢谢一堆.
iex> MapSet.new(1..32) |> Enum.to_list
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
23, 24, 25, 26, 27, 28, 29, 30, 31, 32]
iex> MapSet.new(1..33) |> Enum.to_list
[11, 26, 15, 20, 17, 25, 13, 8, 7, 1, 32, 3, 6, 2, 33, 10, 9, 19, 14, 5, 18, 31,
22, 29, 21, 27, 24, 30, 23, 28, 16, 4, 12]
Run Code Online (Sandbox Code Playgroud)
这是Elixir 1.3中的实现
def new(enumerable) do
map …Run Code Online (Sandbox Code Playgroud)
我正在尝试将 e 中的 a 舍Float入到小数点后两位。
如果我有数字12.555,我希望我的舍入函数返回12.56
我最初认为这Float.round是我想要的,但这个函数并不总是返回我想要的答案。
例如...
iex()> Float.round(12.555, 2)
12.55
Run Code Online (Sandbox Code Playgroud)
我知道我可以通过临时功能完成这项工作,但我认为必须有更好的解决方案。
我目前的解决方案是...
iex()> round(12.555 * 100) / 100
12.56
Run Code Online (Sandbox Code Playgroud)
这可以完成工作,但就像我说的那样,我只是想知道是否有更好的解决方案。
提前致谢
我正在尝试使用 docker 运行部署,并且使用以下命令成功运行:
\ndocker build -t romenigld/blog-prod .
但是当我尝试使用这个命令时:
\ndocker run --env-file .env -p 8080:4000 romenigld/blog-prod
我收到此错误:
\nError loading shared library libstdc++.so.6: No such file or directory (needed by /app/erts-12.0.2/bin/beam.smp)\nError loading shared library libgcc_s.so.1: No such file or directory (needed by /app/erts-12.0.2/bin/beam.smp)\nError relocating /app/erts-12.0.2/bin/beam.smp: __cxa_begin_catch: symbol not found\nError relocating /app/erts-12.0.2/bin/beam.smp: _ZSt24__throw_out_of_range_fmtPKcz: symbol not found\nError relocating /app/erts-12.0.2/bin/beam.smp: _Znwm: symbol not found\nError relocating /app/erts-12.0.2/bin/beam.smp: _ZSt20__throw_length_errorPKc: symbol not found\nError relocating /app/erts-12.0.2/bin/beam.smp: __cxa_guard_release: symbol not found\nError relocating /app/erts-12.0.2/bin/beam.smp: _ZNKSt8__detail20_Prime_rehash_policy11_M_next_bktEm: …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试使用嵌入式elixir(在我的例子中是.html.eex文件).我知道如何渲染elixir哈希,但我无法弄清楚如何创建显示列表中所有项目的内容.在Ruby中它会像这样工作:
<% array.each do |item| %>
<p> <%= item %> </p>
<% end %>
Run Code Online (Sandbox Code Playgroud) 例如,我有一个结构
post = %Post{title: "Title", desc: nil}
Run Code Online (Sandbox Code Playgroud)
我想得到
%{title: "Title"}
Run Code Online (Sandbox Code Playgroud)
我的解决方案就像
post
|> Map.delete(:__struct__) # change the struct to a Map
|> Enum.filter(fn {_, v} -> v end)
|> Enum.into(%{})
Run Code Online (Sandbox Code Playgroud)
它有效,但有更好的吗?
更新:
我觉得很烦人从Struct转换为Map,然后是Enum,然后再转换Map.有简洁的方法吗?
我正在开始我的Elixir/Phoenix之旅并且在我的postgres连接上遇到了一些麻烦.
当我启动我的服务器时,我得到:
$ mix phoenix.server
[error] Postgrex.Protocol (#PID<0.214.0>) failed to connect: ** (Postgrex.Error) tcp connect: connection refused - :econnrefused
[error] Postgrex.Protocol (#PID<0.217.0>) failed to connect: ** (Postgrex.Error) tcp connect: connection refused - :econnrefused
[error] Postgrex.Protocol (#PID<0.218.0>) failed to connect: ** (Postgrex.Error) tcp connect: connection refused - :econnrefused
[error] Postgrex.Protocol (#PID<0.211.0>) failed to connect: ** (Postgrex.Error) tcp connect: connection refused - :econnrefused
[error] Postgrex.Protocol (#PID<0.215.0>) failed to connect: ** (Postgrex.Error) tcp connect: connection refused - :econnrefused
[error] Postgrex.Protocol (#PID<0.219.0>) failed to …Run Code Online (Sandbox Code Playgroud) 我正试图IEx.pry在测试中启动.但是我无法在iex会话中运行测试.请注意,我没有使用mix.
ExUnit.start
defmodule Calc do
def add(a,b) do
a + b
end
end
defmodule TheTest do
use ExUnit.Case
test "adds two numbers" do
require IEx
IEx.pry
assert Calc.add(1, 2) == 3
end
end
Run Code Online (Sandbox Code Playgroud)
我试着用ExUnit.run挂起来运行它并最终超时:
manuel@laptop:~/exercism/elixir/nucleotide-count$ iex test.exs
Erlang/OTP 18 [erts-7.3] [source] [64-bit] [smp:4:4] [async-threads:10] [kernel-poll:false]
Interactive Elixir (1.3.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> ExUnit.run
** (exit) exited in: GenServer.call(ExUnit.Server, {:take_async_cases, 8}, 60000)
** (EXIT) time out
(elixir) lib/gen_server.ex:604: GenServer.call/3
(ex_unit) …Run Code Online (Sandbox Code Playgroud) elixir ×10
alpine-linux ×1
boxen ×1
docker ×1
ecto ×1
elixir-iex ×1
ex-unit ×1
list ×1
math ×1
set ×1