web-dev-qa-db-ja.com

エリクサーのパイプに匿名関数を渡す方法

私はこのようなコードを書きたいと思います:

def boundary do
  :crypto.Rand_bytes(8)
  |> Base.encode16
  |> &("--------FormDataBoundary" <> &1)
end

しかし、それは機能しません。

41
ruisin

それは少し奇妙に見えますが、うまくいくはずです:

def boundary do
  :crypto.Rand_bytes(8)
  |> Base.encode16
  |> (&("--------FormDataBoundary" <> &1)).()
end
67
couchemar

関連:「無名」関数が変数に割り当てられている場合、次のようにパイプすることができます。

def boundary do
  add_marker = fn (s) ->
    "--------FormDataBoundary" <> s
  end

  :crypto.Rand_bytes(8)
  |> Base.encode16
  |> add_marker.()
end
12
Nathan Long

受け入れられた答えは機能しますが、これを使用してこれをもう少しエレガントに行うことができます

(&"--------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に置き換えました。

2
Harlan T Wood

あなたは文字通り行くことができないのですか?

thing
|> func_one()
|> fn input -> do_stuff_here() end)

直接ケースにパイプするようなものを行うことができます

thing
|> func_one()
|> case do

したがって、無名関数にパイプするだけでよいと思います。

1
Ian

次のようなものも使用できます。

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

...何らかの理由で、パイプラインでその関数を複数回呼び出す必要がある場合、彼の答えはより良いでしょう。

0
Kenny Evitt