私はこのようなコードを書きたいと思います:
def boundary do
:crypto.Rand_bytes(8)
|> Base.encode16
|> &("--------FormDataBoundary" <> &1)
end
しかし、それは機能しません。
それは少し奇妙に見えますが、うまくいくはずです:
def boundary do
:crypto.Rand_bytes(8)
|> Base.encode16
|> (&("--------FormDataBoundary" <> &1)).()
end
関連:「無名」関数が変数に割り当てられている場合、次のようにパイプすることができます。
def boundary do
add_marker = fn (s) ->
"--------FormDataBoundary" <> s
end
:crypto.Rand_bytes(8)
|> Base.encode16
|> add_marker.()
end
受け入れられた答えは機能しますが、これを使用してこれをもう少しエレガントに行うことができます
(&"--------FormDataBoundary#{&1}").()
の代わりに
(&("--------FormDataBoundary" <> &1)).()
これが完全な機能です:
def boundary do
:crypto.strong_Rand_bytes(8)
|> Base.encode16()
|> (&"--------FormDataBoundary#{&1}").()
end
ボーナス::crypto.Rand_bytes/1
(elixir 1.6以降には存在しない)も:crypto.strong_Rand_bytes/1
に置き換えました。
あなたは文字通り行くことができないのですか?
thing
|> func_one()
|> fn input -> do_stuff_here() end)
直接ケースにパイプするようなものを行うことができます
thing
|> func_one()
|> case do
したがって、無名関数にパイプするだけでよいと思います。
次のようなものも使用できます。
def boundary do
:crypto.Rand_bytes(8)
|> Base.encode16
|> (fn chars -> "--------FormDataBoundary" <> chars end).()
end
この形式の利点の1つは、単純な 'case'ステートメントを簡単に記述できることです。
def do_some_stuff do
something
|> a_named_function()
|> (
fn
{:ok, something} -> something
{:error, something_else} ->
Logger.error "Error"
# ...
end
).()
end
から:
上記のようにfn
を使用すると、小さなビットが couchemarの答えよりも明確になります :
def boundary do
:crypto.Rand_bytes(8)
|> Base.encode16
|> (&("--------FormDataBoundary" <> &1)).()
end
...しかし、あなたの特定の例では、&
がおそらく最良です。パイプライン式がより複雑な場合は、無名関数のパラメーターに名前を付ける方が便利な場合があります。
私の答えは、少しよりも簡潔です ネイサンロングの答え :
def boundary do
add_marker = fn (s) ->
"--------FormDataBoundary" <> s
end
:crypto.Rand_bytes(8)
|> Base.encode16
|> add_marker.()
end
...何らかの理由で、パイプラインでその関数を複数回呼び出す必要がある場合、彼の答えはより良いでしょう。