2016-08-08 7 views
2

私はエリクシールを初めて使う人です。私は、このコードではパターンマッチングとデフォルトパラメータ

defmodule DefaultParams do 
    def func(p1, p2 \\ 2, p3 \\ 3, p4) do 
    IO.inspect [p1, p2, p3, p4] 
    end 
end 

:私はこのコードを持っている

DefaultParams.func("a", "b") #=> ("a", 2, 3, "b") 

それがそのように動作し、なぜ私が理解:なぜならパターンマッチング。 Elixirは、提供されたパラメータを関数定義で定義されているものと照合しようとします。

しかし、私はこれを理解していない:

DefaultParams.func("a", "b", "c") #=> ("a", "b", 3, "c") 

はなぜ出力されません("a", 2, "b", "c")のですか?これは、パラメータで定義されたパターンにも適合します。私はドキュメントで詳細な説明を探しましたが、何も見つかりませんでした。

しばらくそれについて考えた後、私はそれがこのように動作することを疑い開発:

  1. 「」P1に一致するを
  2. 「B」P2
  3. 「Cに一致しています"はp3にマッチしません。なぜなら、不一致があるからです。だから、それがスキップされ、誰かが説明/確認することができP3は3
  4. 「C」であるデフォルト値は、P4

にマッチングされますか?

編集:固定タイプミス

答えて

6

とP4で、値がないので、Cに一致していません:

def func(p1, p2 \\ 2, p3 \\ 3, p4) do 
    IO.inspect [p1, p2, p3, p4] 
end 

あなたのコードと種類をコンパイルする場合h DefaultParams.functabと、それはあなたが

iex> h DefaultParams.func 
func/2 func/3 func/4 

それは実際にあなたのための3つの機能を作成したが表示されます。

def func(p1, p4),  do: func(p1, 2, 3, p4) 
def func(p1, p2, p4), do: func(p1, p2, 3, p4) 
def func(p1, p2, p3, p4) do 
    IO.inspect [p1, p2, p3, p4] 
end  

iex> func(:a, :b)   # calling func/2, which is actually func(p1, 2, 3, p4) 
[:a, 2, 3, :b] 

iex> func(:a, :b, :c)  # calling func/3, which is actually func(p1, p2, 3, p4) 
[:a, :b, 3, :c] 

iex> func(:a, :b, :c, :d) # calling func/4 
[:a, :b, :c, :d] 
+0

ああ、非常照明。ありがとうございました! –

2

はそれのために良いの参照を見つけることができませんが、私の理解では、それが左から右に一致させようとしています。そう、bがマッチします、P3、P4はので、次のオプションは、あなたの例を使用するには、C

関連する問題