标签: elixir

Elixir - 动态调用私有函数

我发现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)

elixir

12
推荐指数
3
解决办法
4375
查看次数

从Pipeline Plug调用时,Plug.Conn.assign无法正常工作

我正在关注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)

elixir phoenix-framework

12
推荐指数
1
解决办法
3370
查看次数

如何在Phoenix中的通道上启用压缩?

我有一个凤凰频道推出了大约4KB的数据,很多都是高度重复的,并且想知道是否有办法打开该频道的压缩.

如果我正在使用凤凰控制器,它看起来相当简单,但我无法确定这是否可行或在某个地方为某个频道记录.

谢谢一堆.

elixir phoenix-framework

12
推荐指数
1
解决办法
931
查看次数

为什么Elixir的MapSet在32个元素之后变得无序?

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)

set elixir

12
推荐指数
1
解决办法
768
查看次数

在长生不老药中使浮点数变圆的最佳方法是什么

我正在尝试将 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)

这可以完成工作,但就像我说的那样,我只是想知道是否有更好的解决方案。

提前致谢

math floating-point elixir elixir-iex

12
推荐指数
1
解决办法
3529
查看次数

docker run 加载共享库 libstdc++.so.6 和 libgcc_s.so.1 时出错

我正在尝试使用 docker 运行部署,并且使用以下命令成功运行:

\n

docker build -t romenigld/blog-prod .

\n

但是当我尝试使用这个命令时:

\n

docker run --env-file .env -p 8080:4000 romenigld/blog-prod

\n

我收到此错误:

\n
Error 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 docker phoenix-framework docker-compose alpine-linux

12
推荐指数
1
解决办法
1万
查看次数

迭代嵌入式Elixir中的列表

我目前正在尝试使用嵌入式elixir(在我的例子中是.html.eex文件).我知道如何渲染elixir哈希,但我无法弄清楚如何创建显示列表中所有项目的内容.在Ruby中它会像这样工作:

<% array.each do |item| %>
    <p> <%= item %> </p>
<% end %> 
Run Code Online (Sandbox Code Playgroud)

list elixir

11
推荐指数
2
解决办法
5528
查看次数

在Elixir的结构中删除nil值的好方法是什么?

例如,我有一个结构

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

11
推荐指数
3
解决办法
8329
查看次数

为什么Phoenix(ecto/Postgresx)无法在开发中连接

我正在开始我的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)

elixir boxen ecto phoenix-framework

11
推荐指数
2
解决办法
1万
查看次数

如何在IEx中运行ExUnit测试

我正试图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 ex-unit

11
推荐指数
1
解决办法
1699
查看次数