gpt4 book ai didi

elixir - 如何使用 Enum 而不是 If 语句有条件地减少变更集

转载 作者:行者123 更新时间:2023-12-02 11:57:05 28 4
gpt4 key购买 nike

我正在使用一堆可选字段加密变更集,但我目前正在使用大量 If 语句来在尝试加密之前查看变更集是否包含字段。

我有一种感觉,有一个 Enum 函数(比如 reduce)可以以一种更惯用的 Elixir 方式来执行此操作,但我想出的所有方法都不比大量丑陋的 If 语句更高效。

 def encrypt(changeset) do
if changeset.changes["address"] do
{:ok, encrypted_address} = EncryptedField.dump(changeset.changes.address, key_id)
changeset
|> put_change(:address, encrypted_address)
end
if changeset.changes["dob"] do
{:ok, encrypted_dob} = EncryptedField.dump(changeset.changes.dob, key_id)
changeset
|> put_change(:address, encrypted_dob)
end
if changeset.changes["email"] do
{:ok, encrypted_email} = EncryptedField.dump(changeset.changes.email, key_id)
changeset
|> put_change(:email, encrypted_email)
end
...
end

最佳答案

您所需要的只是迭代字段,有条件地更新变更集:

def encrypt(changeset) do
Enum.reduce(~w[address dob email]a, changeset, fn field, changeset ->
if changeset.changes[field] do
{:ok, encrypted} =
EncryptedField.dump(changeset.changes[field], key_id)
put_change(changeset, field, encrypted)
else
changeset # unlike your implementation this works
end
end)
end

另一种方法是 Enum.filter/2第一个字段:

def encrypt(changeset) do
~w[address dob email]a
|> Enum.filter(&changeset.changes[&1])
|> Enum.reduce(changeset, fn field, changeset ->
{:ok, encrypted} =
EncryptedField.dump(changeset.changes[field], key_id)
put_change(changeset, field, encrypted)
end)
end

旁注:根据核心团队的风格指南,当且仅当链中有许多链接时才使用管道。


回复第二个答案:

使用 with 的惯用代码是:

def encrypt(changeset) do
~w[address dob email] |> Enum.reduce(changeset, fn field ->
with %{^field => value} <- changeset.changes,
{:ok, encrypted} <- EncryptedField.dump(value, key_id)
do
put_change(changeset, field, encrypted)
else
_ -> changeset
end
end)
end

关于elixir - 如何使用 Enum 而不是 If 语句有条件地减少变更集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54588347/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com