标签: elixir

Elixir Macros:将原子转换为变量

我想创建一个Elixir宏,将原子列表[:a,:b]转换为变量a,b.a和b的值可以是任何东西 - 我想要实现的是创建一个具有传入的原子的可读名称的变量.这可能吗?如果是这样,怎么样?

macros elixir

8
推荐指数
1
解决办法
235
查看次数

基于结构类型更改的分块列表

我有一个列表,我希望根据从结构类型B到A的转换进行分块.例如,我有以下内容:

iex(1)> defmodule A, do: defstruct []
{:module, A ...
iex(2)> defmodule B, do: defstruct []
{:module, B ...
iex(3)> values = [ %A{}, %A{}, %B{}, %B{}, %B{}, %A{}, %A{}, %B{} ]
[%A{}, %A{}, %B{}, %B{}, %B{}, %A{}, %A{}, %B{}]
Run Code Online (Sandbox Code Playgroud)

我希望将这些数据分成2个元素列表,其中包含:

[ [ %A{}, %A{}, %B{}, %B{}, %B{} ], [ %A{}, %A{}, %B{} ] ]
Run Code Online (Sandbox Code Playgroud)

如果输入最初都是A或全部B,则输出将保持不变,因为没有发生B-> A转换.

我想Enum.chunk_by/2是要走的路,但是我很难弄清楚如何保持前一个元素的上下文来知道何时分割.

对这样的事物的惯用解决方案是什么样的?

elixir

8
推荐指数
2
解决办法
169
查看次数

模式匹配Elixir记录Aganist Struct

有没有办法模拟匹配结构的记录?例如,给出下面的记录和结构.

struct = %User{name: "", twitter:""}
record = {User, "mossplix ", "@mossplix"}
Run Code Online (Sandbox Code Playgroud)

erlang record elixir

8
推荐指数
1
解决办法
2156
查看次数

Elixir - 关键字列表和地图之间的差异

刚刚开始使用Dave Thomas的Elixir书.

它谈到了两个概念:

关键字列表

[ name: "Dave", city: "Dallas", likes: "Programming" ]
Run Code Online (Sandbox Code Playgroud)

地图

states = %{ "AL" => "Alabama", "WI" => "Wisconsin" }
Run Code Online (Sandbox Code Playgroud)

你何时会选择一个而不是另一个?

elixir

8
推荐指数
1
解决办法
1049
查看次数

测试Elixir Ecto模型关联的最佳实践

我正试图在Elixir中测试一个属于该关联的人.

假设我有两个型号,一个产品和一个ProductType.产品属于产品类型.

defmodule Store.Product do
  use Store.Web, :model

  schema "products" do
    field :name, :string

    belongs_to :type, Store.ProductType, foreign_key: :product_type_id

    timestamps
  end

  @required_fields ~w(name product_type_id)

  @optional_fields ~w()

  def changeset(model, params \\ :empty) do
    model
    |> cast(params, @required_fields, @optional_fields)
  end
end

defmodule Store.ProductType do
  use Store.Web, :model

  schema "product_types" do
    field :name, :string

    timestamps
  end

  @required_fields ~w(name)
  @optional_fields ~w()

  def changeset(model, params \\ :empty) do
    model
    |> cast(params, @required_fields, @optional_fields)
  end
end
Run Code Online (Sandbox Code Playgroud)

这是我在测试文件中的内容:

defmodule Store.ProductTest do
  use Store.ModelCase

  alias Store.Repo
  alias Store.Product …
Run Code Online (Sandbox Code Playgroud)

elixir ecto phoenix-framework

8
推荐指数
1
解决办法
3179
查看次数

Phoenix返回POST的200状态代码

我的Phoenix API返回200POST请求的状态代码而不是201.200如果我没有设置状态代码,Phoenix默认使用.

这是样本回复.

conn |> json(%{created_at: response[:timestamp], notes: response[:notes], data: data})
Run Code Online (Sandbox Code Playgroud)

elixir phoenix-framework

8
推荐指数
1
解决办法
3924
查看次数

从Elixir中的String获取子字符串

在Ruby中,我可以去:

"Sergio"[1..-1] #> "ergio"
Run Code Online (Sandbox Code Playgroud)

在Elixir中执行相同操作会产生运行时错误:

iex(1)> "Sergio"[1..-1]
** (CompileError) iex:1: the Access syntax and calls to Access.get/2 are not available for the value: "Sergio"
Run Code Online (Sandbox Code Playgroud)

还尝试过:

iex(1)> String.slice("Sergio", 1, -1)
** (FunctionClauseError) no function clause matching in String.slice/3
(elixir) lib/string.ex:1471: String.slice("Sergio", 1, -1)
Run Code Online (Sandbox Code Playgroud)

如何从Elixir中的字符串中获取子字符串?

string elixir

8
推荐指数
2
解决办法
8227
查看次数

强制执行结构中的所有键

如何在不需要复制所有键的情况下强制执行结构中的所有键?为了澄清,我想干这个:

defmodule Ticket do
  @enforce_keys [:origin, :destination, :price]
  defstruct [:origin, :destination, :price]
end
Run Code Online (Sandbox Code Playgroud)

我可以使用其他变量:

defmodule Ticket do
  struct_keys = [:origin, :destination, :price]
  @enforce_keys struct_keys
  defstruct struct_keys
end
Run Code Online (Sandbox Code Playgroud)

它工作正常,但看起来很吵.有没有更好的方法?

struct elixir

8
推荐指数
1
解决办法
1177
查看次数

Elixir:减少列表以映射计数发生(模式匹配另一个参数上的映射键)

我有一个可能包含重复的列表.我想计算列表中每个项目的实例数.我的计划是:

list
|> Enum.reduce(%{}, fn
  item, %{item => count}=acc -> %{acc | item => count + 1}
  item, acc -> Map.put(acc, item, 1)
end)
Run Code Online (Sandbox Code Playgroud)

但是,这无法编译错误illegal use of variable item inside map key match, maps can only match on existing variable by using ^item.

所以我改变了第一个模式item, %{^item => count}=acc.那时,错误就变成了unbound variable ^item.

我不知道该怎么做.我知道可以基于另一个模式匹配一​​个参数(比如fn a, a -> true一个比较函数的头部),但显然不是这种情况.我试着用守卫做这件事但Map.has_key?/2不能戴卫兵.我在这里找到了很多关于在地图上匹配的问题,但是当匹配的值来自另一个参数时,我没有这么做.

dictionary count elixir duplicates pattern-matching

8
推荐指数
1
解决办法
2198
查看次数

在Elixir中创建UUID

在Elixir中生成UUID的规范方法是什么?我是否必须使用库https://hex.pm/packages/uuid或是否有内置库?我更好地拥有更少的依赖关系并且做更多的工作而不是反之亦然,因此如果我可以在Elixir中生成具有外部依赖性的东西,那么最好还是使用它.

elixir

8
推荐指数
3
解决办法
5553
查看次数