エリクサー1.2にはキーワード「with」が含まれていますが、それが何であるかは完全にわかりません。エリクシルの "with"キーワードの使い方とその目的は何ですか?
どうすればどのような状況で使用できますか?前1.2へのエリクサーのバージョンで
エリクサー1.2にはキーワード「with」が含まれていますが、それが何であるかは完全にわかりません。エリクシルの "with"キーワードの使い方とその目的は何ですか?
どうすればどのような状況で使用できますか?前1.2へのエリクサーのバージョンで
パイプラインの機能を使用しているとき、あなたはモナドライブラリや巣のcase文を使用しなければならないのいずれか(プライベート関数を使用してリファクタリングすることができ、それでも冗長になってしまうでしょう) 。 with/1は、この問題を解決する別の方法を可能にします。ここで
はoriginal proposalからの例です。ここで
case File.read(path) do
{:ok, binary} ->
case :beam_lib.chunks(binary, :abstract_code) do
{:ok, data} ->
{:ok, wrap(data)}
error ->
error
end
error ->
error
end
は、機能を使用するためにリファクタリング同じものである:
path
|> File.read()
|> read_chunks()
|> wrap()
defp read_chunks({:ok, binary}) do
{:ok, :beam_lib.chunks(binary, :abstract_code)}
end
defp read_chunks(error), do: error
defp wrap({:ok, data}) do
{:ok, wrap(data)}
end
defp wrap(error), do: error
そしてwith
を使用して、同じコード:
with {:ok, binary} <- File.read(path),
{:ok, data} <- :beam_lib.chunks(binary, :abstract_code),
do: {:ok, wrap(data)}
これは、with
は値が左側のパターンと一致する場合は連鎖します。そうでない場合、チェーンは中止され、最初に一致しない結果が返されます。ファイルが存在しない場合たとえば、その後File.read(path)
は{:error, :enoent}
を返します - これは{:ok, binary}
と一致していませんので、with/1
コールが{:error, :enoent}.
では、任意のパターンだけでなく、{:ok, foo}
と{:error, reason}
(ただしで使用することができることは注目に値するを返します。非常に一般的な使用例です)。
ます。また、チェーン「裸の表現」することができ、ドキュメントが言うように:
with {:ok, binary} <- File.read(path),
header = parse_header(binary),
{:ok, data} <- :beam_lib.chunks(header, :abstract_code),
do: {:ok, wrap(data)}
変数header
だけwith
文の中利用できるようになります。さらに詳しい情報はhttps://gist.github.com/josevalim/8130b19eb62706e1ab37
を指摘しておきたいことがありますが、with
の説明文に記載されています。 例:
defmodule Test do
def test(res) do
with {:ok, decode_res} when is_map(decode_res) <- res
do
IO.inspect "ok"
else
decode_res when is_map(decode_res) -> IO.inspect decode_res
_ ->
IO.inspect "error"
end
end
end
Test.test({:ok , nil})
Test.test({:ok , 12})
Test.test({:ok , %{}})
実際、「バージョンあり」ははるかに優れています。これは非常に便利です。 – diogovk
私は 'defp read_chunks'の本文はちょうど':beam_lib.chunks(バイナリ、:抽象コード) 'を読むべきだと思っています(つまり、初期の{{:ok、'}なし) – Grandpa
私はok_jose(https:// github。 com/vic/ok_jose)は、(名前を除いて)はるかにきれいに見えます。代わりにそれを使用しない理由はありますか? – Johannes