2016-02-13 34 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") 
相關問題