我想创建一个Elixir宏,将原子列表[:a,:b]转换为变量a,b.a和b的值可以是任何东西 - 我想要实现的是创建一个具有传入的原子的可读名称的变量.这可能吗?如果是这样,怎么样?
我有一个列表,我希望根据从结构类型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是要走的路,但是我很难弄清楚如何保持前一个元素的上下文来知道何时分割.
对这样的事物的惯用解决方案是什么样的?
有没有办法模拟匹配结构的记录?例如,给出下面的记录和结构.
struct = %User{name: "", twitter:""}
record = {User, "mossplix ", "@mossplix"}
Run Code Online (Sandbox Code Playgroud) 刚刚开始使用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中测试一个属于该关联的人.
假设我有两个型号,一个产品和一个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) 我的Phoenix API返回200POST请求的状态代码而不是201.200如果我没有设置状态代码,Phoenix默认使用.
这是样本回复.
conn |> json(%{created_at: response[:timestamp], notes: response[:notes], data: data})
Run Code Online (Sandbox Code Playgroud) 在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中的字符串中获取子字符串?
如何在不需要复制所有键的情况下强制执行结构中的所有键?为了澄清,我想干这个:
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)
它工作正常,但看起来很吵.有没有更好的方法?
我有一个可能包含重复的列表.我想计算列表中每个项目的实例数.我的计划是:
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不能戴卫兵.我在这里找到了很多关于在地图上匹配的问题,但是当匹配的值来自另一个参数时,我没有这么做.
在Elixir中生成UUID的规范方法是什么?我是否必须使用库https://hex.pm/packages/uuid或是否有内置库?我更好地拥有更少的依赖关系并且做更多的工作而不是反之亦然,因此如果我可以在Elixir中生成具有外部依赖性的东西,那么最好还是使用它.
elixir ×10
count ×1
dictionary ×1
duplicates ×1
ecto ×1
erlang ×1
macros ×1
record ×1
string ×1
struct ×1