标签: elixir

Elixir - 地图结构上的模式匹配,而不是键

在Elixir中,我有一个嵌套映射列表,每个映射都有相同的基本结构 - 例如:

nested_map_list = [
    %{foo: %{test: "Hi"}},
    %{bar: %{test: "Hello"}},
    %{baz: %{test: "Hey"}}
]
Run Code Online (Sandbox Code Playgroud)

因此,它们在上层各有一个不同的键,但在嵌套映射中有相同的键.有没有办法可以迭代这个列表,以便每次迭代访问嵌套映射,而不管上层的键?

为了说明我的意思,请考虑这个伪代码:

Enum.each(nested_map_list, fn(%{_key: nested_data}) -> IO.puts nested_data.test end)

> "Hi"
> "Hello"
> "Hey"
Run Code Online (Sandbox Code Playgroud)

非常感谢!

elixir

0
推荐指数
1
解决办法
483
查看次数

Elixir - 以二进制替换位置

问题

我正试图在Elixir中制作一个基本图像(位图)写入,但我坚持一点.

我试图创建一个将像素设置为二进制的函数.我使用模式匹配,但我的功能显然太慢(超过10分钟将所有像素设置为1024*768的图片).

目前,我有一个大小等于宽度*高度的二进制文件.就像你在下面的代码中看到的那样,我的函数将x和y作为params并且必须在这个位置修改int.


目前的代码

# Function
def replace_by_test(output, width, x, y) do
    out_offset = y * width + x
    <<
        o_before :: binary-size(out_offset),
        _ :: binary-size(4),
        o_after :: binary
    >> = output

    << o_before :: binary, "TEST" :: binary, o_after :: binary >>
end

# Test on a 1024 * 768 resolution image
out_size = 1024 * 768 * 8
output = << 0 :: size(out_size) >>
for x <- 0..(1024*768-1), do: replace_by_test(output, 1024, 0, 0)
Run Code Online (Sandbox Code Playgroud)

目标

使这段代码更快.如果可能,请在不到10秒的时间内运行.

elixir

0
推荐指数
1
解决办法
166
查看次数

有没有办法访问GenServer的状态?

是否有内置方式来查看GenServer的当前状态?你总是可以实现一个简单的调用来返回状态,但是有更通用的方法吗?

当我运行:observer.start时,我可以查看正在运行的应用程序并查看它们的状态,这似乎是可能的.但它可能会做一些双重秘密的Erlang voodoo来实现这一目标.

erlang elixir erlang-otp

0
推荐指数
1
解决办法
469
查看次数

Elixir可枚举的块:如何将列表划分为根据n的倍数划分的子列表

假设我在Elixir中有一个严格增加整数的列表,我想在数字大于5的倍数时分解为子列表.我正在尝试使用chunk_by但是我得到了这个:

Enum.chunk_by([300, 301, 304, 305, 306, 309, 310, 311, 312, 313, 314, 
315, 316, 317, 319, 320], fn(x) -> rem(x, 5) == 0 end)

 [
  [300],
  [301, 304],
  [305],
  [306, 309],
  [310],
  [311, 312, 313, 314],
  [315],
  [316, 317, 319],
  [320]
]
Run Code Online (Sandbox Code Playgroud)

当我真正想要的是:

[
  [300, 301, 304],
  [305, 306, 309],
  [310, 311, 312, 313, 314],
  [315, 316, 317, 319],
  [320]
]
Run Code Online (Sandbox Code Playgroud)

我基本上需要在"5边界"上分解的列表,但没有边界本身创建单独的列表.我该怎么做?

elixir

0
推荐指数
1
解决办法
86
查看次数

从elixir中的exs文件中运行exs文件

我想运行两个elixir脚本,first.exssecond.exs.我想第二个也先跑.什么是一个很好的方式来运行它?

例如,代码可能如下所示:

first.exs

IO.puts "first"
Run Code Online (Sandbox Code Playgroud)

second.exs

IO.puts "second"
System.cmd("mix run first.exs")
Run Code Online (Sandbox Code Playgroud)

并输出这样的东西:

mix run first.exs
first

mix run second
first
second
Run Code Online (Sandbox Code Playgroud)

我想避免使用System.cmd,Mix尽可能使用该模块

scripting elixir

0
推荐指数
1
解决办法
1171
查看次数

使用Ecto变更集删除尾随和前导空格

Ecto中是否有内置方法可以在将其插入数据库之前Ecto.Changeset在调用时删除字段的尾部和前导空格changeset/2


目前,我正在向架构中添加两个自定义函数以进行数据过滤以提高数据完整性:

defp trim_fields(changeset, fields) do
  Enum.reduce(fields, changeset, &trim(&2, &1))
end

defp trim(changeset, field) do
  if get_change(changeset, field) do
    update_change(changeset, field, &String.trim/1)
  else
    changeset
  end
end
Run Code Online (Sandbox Code Playgroud)

然后,可以使用以下方法将changeset/2函数传递给函数:

def changeset(%Customer{} = customer, attrs) do
  |> cast(attrs, [:first_name, :last_name])
  |> validate_required([:first_name], [:last_name])
  |> trim_fields([:first_name, :last_name])
end
Run Code Online (Sandbox Code Playgroud)

因为我认为这是一个常见的用例,所以我想知道是否有一个已经提供此功能的功能?

如果Ecto中尚未提供此功能,那么从Ectos API的角度来看,添加此类功能并命名它们会很方便filter_trimfilter_...我猜呢?

elixir ecto

0
推荐指数
1
解决办法
560
查看次数

Elixir了解GenServer

我是Elixir的新手,正在阅读一本书并做一些例子.这是让我在这里提问的一段代码:

defmodule Sequence.Server do
    use GenServer
    def init(initial_number)do 
        {:ok,initial_number}
    end

    def handle_call(:next_number, _from, current_number)do
        {:reply, current_number,current_number+1}    
    end 
end
Run Code Online (Sandbox Code Playgroud)

据我所知,在初始化服务器时调用init函数,我们正在定义一些参数 - 这将是服务器的初始状态.令我困惑的是,current_numberinitial_number是如何相互关联的,我的意思是在代码中没有我们说的那样的东西

current_number = initial_number

因为当我调用GenServer.call(some_process_id, :next_number)它时从100开始,例如,如果start_link的参数是100.如果我们在初始状态和current_number参数之间没有任何映射,Elixir如何理解它必须从100开始

erlang functional-programming elixir erlang-otp gen-server

0
推荐指数
1
解决办法
137
查看次数

Enum.map中的Enum.sum返回字母而不是整数

我试图获得17位数的列表数字,然后将其拆分Integer.digits,并得到这些数字的总和.不幸的是我一直在意外行为(我的结果包含一串字母)并且不确定这是一个错误还是个人错误.

下面是iex错误的控制台,结果给出'Q $':

iex(4)> numbers = [
...(4)>   [1, 4, 8, 1, 3, 6, 9, 4, 2, 5, 5, 6, 3, 1, 8, 8, 7],
...(4)>   [1,5, 9, 4, 1, 3, 2, 7],
...(4)>   [1, 5, 4, 6, 5, 7, 8]
...(4)> ]
iex(5)> Enum.map(numbers, fn x -> Enum.sum(x) end)            
'Q $'
Run Code Online (Sandbox Code Playgroud)

但是当我从最后一个列表中删除一个数字时,它再次正常工作,并给出预期的结果

iex(1)> numbers = [ 
...(1)>   [1, 4, 8, 1, 3, 6, 9, 4, 2, 5, 5, 6, 3, 1, 8, 8, …
Run Code Online (Sandbox Code Playgroud)

elixir

0
推荐指数
1
解决办法
209
查看次数

Phoenix Websocket socket.disconnect()与channel.leave()

我正在阅读有关如何从套接字断开连接或离开通道的phoenix文档

我天真的理解是 channel#leave

取消订阅服务器事件,并指示通道在服务器上终止

socket#disconnect维护通道服务器端,以便重新连接。

因此,我的问题是何时使用一个与另一个。

听起来有两种情况需要考虑:

  1. 还有其他客户端订阅了相同的频道,因此#leave将切断他们的连接,而倾向于#disconnect
  2. 但是,如果存在用户/帐户损耗,则从不调用来leave维护服务器上的“死”通道,而对于长时间运行的进程,这可能是一个问题吗?

我在想这个吗?如果我们选择只使用#disconnect-roll,我们是否应该实施定期的清理任务以杀死长时间运行的“死”通道?

谢谢!

elixir websocket phoenix-framework

0
推荐指数
1
解决办法
597
查看次数

指定模块名称后如何访问与Config相关的键

在phoenix中查看配置文件时,如果我创建这样的配置:

config :myapp,
  http: 4000
Run Code Online (Sandbox Code Playgroud)

我可以像这样在我的代码中引用该键:

Application.fetch_env!(:myapp, :http)
Run Code Online (Sandbox Code Playgroud)

有时配置似乎特定于某个模块,例如下面的MyApp.Endpoint。

这只是将配置分为几类吗?如果我也需要如何在代码中引用下面的http端口?

config :myapp, MyApp.Endpoint,
  http: [port: 4000],
  debug_errors: true
Run Code Online (Sandbox Code Playgroud)

elixir phoenix-framework

0
推荐指数
2
解决办法
100
查看次数