是否可以在结构上管道`put_in`调用?

时间:2016-02-13 02:28:19

标签: elixir

给定一张地图,可以编写如下内容:

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

理想情况下,我能够对结构做同样的事情:

mystruct
|> put_in(.foo.bar, "hello")
|> put_in(.attr1, "how are you")
|> put_in(.attr2, "goodbye")

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

mystruct = put_in(mystruct.foo.bar, "hello")
mystruct = put_in(mystruct.attr1, "how are you")
put_in(mystruct.attr, "goodbye")

它完成了工作,但并不像使用管道操作员那样优雅。

2 个答案:

答案 0 :(得分:4)

实际上,您可以对结构使用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")

答案 1 :(得分:-1)

你可以使用捕获

hidden_field_tag

应该有用。

编辑:仅适用于地图。 mymap |> put_in([:foo, :bar], "hello") |> put_in([:attr1], "how are you") |> put_in([:attr2], "goodbye") 不适用于结构,因为它们不会实现put_in协议。