2017-10-20 16 views
1

Elixirでパイプ演算子を使用する場合、最初の関数から2番目の関数に渡される出力を選択的または特定にすることは可能ですか?Elixir - パイプ演算子による部分出力の出力

たとえば、私は3つのステップでマップを処理しています - 私は2つのキーを落とし、別のキーの値を更新し、最後に別のキーをポップする必要があります。

for r <- records do 
    {scope, record} = 
    Map.drop(r, [:__struct__, :__meta__]) 
    |> Map.get_and_update(:id, fn current_value -> 
     {current_value, String.replace(current_value, "join", "scope", global: false)} 
    end) 
    |> Map.pop(:user_id) 

    # SOME OTHER STUFF... 

end 

だから、「スコープ」と単語「参加」を交換することにより:idキーの値を更新し、:__struct__:__meta__のキーをドロップしたい:ここで私は、理想的に達成することができるだろう何のイラストです:user_idキーをオフにして、{scope, record}を残してください。ここで、scopeはポップされたキーの値であり、recordは変更されたマップです。コードはそのままでは機能しません。

records = [ 
    %{__struct__: "foo", __meta__: "bar", id: "resource_join:1234", user_id: "user:1234"}, 
    %{__struct__: "foo", __meta__: "bar", id: "resources_join:5678", user_id: "user:5678"}, 
] 

このプロセスの最初のステップは動作し、drop/2ため戻るだけ修飾マップ、get_and_update/3の最初のパラメータの正しい入力である:

ここでサンプルデータの一部です。ただし、get_and_update/3はタプルを返します。最初の値は関数が置き換えられた値で、2番目の値は変更されたマップです。 pop/2は最初の引数としてマップを期待しており、ここではタプルを受け取っているので、これはパイプチェーンが失敗するところです。

get_and_update/3の出力を制御して、返されたタプルの2番目の値だけがパイプを介してpop/2に渡されるようにする方法はありますか?私はこのチェーンをいくつかに分割することによって必要な出力を得ることができましたが、これらを一緒に連鎖させることが可能なら、私はしたいと思います。

+0

誰もあなたのコードをコンソールで実行できるように、データを含めることを検討してください –

+0

[with](http:// learningelixi r.joekain.com/learning-elixir-with/)あなたがそこにいるものの組み合わせで? – matov

+0

'|> Map.pop(...)'の前に '|> elem(1)'を追加するという意味ですか? 'Map.get_and_update'の古い値を気にしなければ' Map.update'もあります。 – Dogbert

答えて

1

あなたはタプルの最初の要素を破棄し、唯一Map.popに2つ目を渡したいので、あなたがパイプラインに|> elem(1)を追加することができます。また

|> Map.get_and_update(:id, fn current_value -> 
    {current_value, String.replace(current_value, "join", "scope", global: false)} 
end) 
|> elem(1) 
|> Map.pop(:user_id) 

Map.get_and_update + elem(1)は、ちょうどMap.updateと交換することができます

|> Map.update(fn current_value -> 
    String.replace(current_value, "join", "scope", global: false) 
end) 
|> Map.pop(:user_id) 
関連する問題