是否可以通过管道对结构体进行“put_in”调用?

Ale*_*iro 3 elixir

给定一张地图,可以这样写:

mymap
|> put_in([:foo, :bar], "hello")
|> put_in([:attr1], "how are you")
|> put_in([:attr2], "goodbye")
Run Code Online (Sandbox Code Playgroud)

理想情况下,我能够对结构执行相同的操作:

mystruct
|> put_in(.foo.bar, "hello")
|> put_in(.attr1, "how are you")
|> put_in(.attr2, "goodbye")
Run Code Online (Sandbox Code Playgroud)

这样的事情可能吗?目前我正在写:

mystruct = put_in(mystruct.foo.bar, "hello")
mystruct = put_in(mystruct.attr1, "how are you")
put_in(mystruct.attr, "goodbye")
Run Code Online (Sandbox Code Playgroud)

它可以完成工作,但不如使用管道运算符那么优雅。

小智 5

实际上,您可以put_in与结构一起使用。这就是你想要的,对于以后偶然发现这一点的任何人:

mymap
|> put_in([:foo, :bar] |> Enum.map(&Access.key/1), "hello")
|> put_in([Access.key(:attr1)], "how are you")
|> put_in([Access.key(:attr2)], "goodbye")
Run Code Online (Sandbox Code Playgroud)