2016-02-13 32 views
2

拿到一张地图,它可以编写类似:是否可以在结构体上调用put_in调用?

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") 

它完成了工作,但没有使用管道运算符那么优雅。

回答

0

可以使用捕捉

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

应该工作。


编辑:只适用于地图。 put_in不适用于结构,因为它们不实现access协议。

+0

我刚刚试过这个,它似乎并没有工作。 –

+0

好的我已经修复了代码,现在应该工作... – jisaacstone

+0

@jisaacestone编辑过的代码仍然出错。我浏览了文档,发现'put_in/3'需要第一个参数来实现访问行为。结构不会实现Access,所以看起来像在'put_in'中输入结构是不可能的。 –

1

实际上,您可以使用带结构的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") 
相关问题