私は、デフォルトのパラメータとnil値に関する一般的な質問があります。私に2つの機能があるとします。一方は他方を呼び出す(これはヘルパー関数である)。どちらもオプションのパラメータを持っています。エリクシール:関数とnil値のオプション/デフォルトパラメータを扱うには?
ヘルパー関数は、リストをジョイナー付きの文字列に結合するだけです。結合子は、optsキーワードリスト内の最初の関数に渡されます。 "AND"
defmodule ParamTest do
def func_1(list, opts \\ []) do
helper(list, opts[:joiner])
# Do something else with the result
end
defp helper(list, joiner \\ "AND") do
Enum.join(list, " #{joiner} ")
end
end
# Example 1
["el 1", "el 2"]
|> ParamTest.func_1(joiner: "AND")
# Result "el 1 AND el 2"
# Example 2
["el 1", "el 2"]
|> ParamTest.func_1
# Result: "el 1 el 2"
# But it should be also "el 1 AND el 2"
にジョイナーの通過はオプションであり、それはデフォルトの問題がある:オプト[:ジョイナー]は第二例ではゼロであろう。しかし、まだ存在しているので、デフォルト値は使用されません。
一つの可能な解決策を使用することですcase
:
defmodule ParamTest do
def func_1(list, opts \\ []) do
case is_nil(opts[:joiner]) do
true -> helper(list)
false -> helper(list, opts[:joiner])
end
# Do something else with the result
end
defp helper(list, joiner \\ "AND") do
Enum.join(list, " #{joiner} ")
end
end
もう一つの方法は、ヘルパーのための2つの関数定義を使用して、パターンマッチングを使用することです:
defmodule ParamTest do
def func_1(list, opts \\ []) do
case is_nil(opts[:joiner]) do
true -> helper(list)
false -> helper(list, opts[:joiner])
end
end
defp helper(list, nil) do
Enum.join(list, " AND ")
end
defp helper(list, joiner \\ "AND") do
Enum.join(list, " #{joiner} ")
end
end
をしかし、私はこのような感じを持っています非常にエレガントではなく、より複雑な状況で乱雑になる可能性があります。
このシナリオではどのような解決策がありますか?
私はプライベート関数のデフォルト引数に同意します。そして私はあなたの2番目の解決策が好きです。ありがとう。 –
ヘルパーが最初の関数からのみ呼び出される場合は、二重のデフォルトを持つことは厄介です。第2の解決策はあなたが||関数呼び出しの中で。他の人がコメント内で他の関数に指摘しているように、あなたのデフォルトのoptsを\\ [joiner: "AND"] – CaptChrisD
@CaptChrisDとする方が良いでしょう。デフォルトでは '[joiner:" AND "]'関数が多くのオプションを受け入れることができるので、良い考えではありません(関数が1つのオプションしか受け付けないことはまれです)。 – whatyouhide