gpt4 book ai didi

elixir - 我可以将管道和更新语法与结构一起使用吗?

转载 作者:行者123 更新时间:2023-12-05 00:48:42 27 4
gpt4 key购买 nike

我发现我想经常更新一个结构,然后将结果传递给另一个函数。更新我的结构的需要不断打破我的管道。

我发现自己经常这样做:

my_struct = %{my_struct | my_field_in_struct: a_new_value} |> my_funct1
my_struct = %{my_struct | my_field_in_struct: a_new_value} |> my_funct2
my_struct = %{my_struct | my_field_in_struct: a_new_value} |> my_funct3

我想做这样的事情:

my_struct
|> %{ | my_field_in_struct: a_new_value}
|> my_funct1
|> %{ | my_field_in_struct: a_new_value}
|> my_funct2
|> %{ | my_field_in_struct: a_new_value}
|> my_funct3

原来的语法可能没有那么糟糕,但仍然如此。

我知道我可以使用 Map.put(),但是我必须在我的模块中编写一个函数来将生成的映射转换回我的结构类型。

以前有没有人遇到过这种微小的烦恼?有干净的替代品吗?

最佳答案

Elixir 的真正优点在于它有宏。那么,如果这是您的应用程序非常常见的操作,您为什么不定义自己的管道运算符呢?

defmodule StructPipe do
defmacro left ~>> right do
{:%{}, [], [{:|, [], [left, right]}]}
end
end

defmodule MyStruct do
defstruct ~w|foo bar baz|a
end

defmodule StructPipe.Test do
import StructPipe
def test do
%MyStruct{foo: 42}
~>> [bar: 3.14]
~>> [baz: "FOOBAR"]
end
end

IO.inspect StructPipe.Test.test, label: "Resulting in"
#⇒ Resulting in: %MyStruct{bar: 3.14, baz: "FOOBAR", foo: 42}

请注意,它可以安全地与正常的 Kernel.|>/2 混合使用。管道:

%MyStruct{foo: 42}
|> IO.inspect(label: "Ini")
~>> [bar: 3.14, baz: 3.14]
|> IO.inspect(label: "Mid")
~>> [baz: "FOOBAR"]
|> IO.inspect(label: "Aft")

#⇒ Ini: %MyStruct{bar: nil, baz: nil, foo: 42}
# Mid: %MyStruct{bar: 3.14, baz: 3.14, foo: 42}
# Aft: %MyStruct{bar: 3.14, baz: "FOOBAR", foo: 42}

关于elixir - 我可以将管道和更新语法与结构一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49302900/

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