2016-08-08 2 views
2

Я новичок в Elixir. У меня есть этот код:Соответствие шаблону и параметры по умолчанию

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") 

Я понимаю, почему он работает именно так: из-за сравнения с шаблоном. Эликсир пытается сопоставить поставленные параметры с теми, которые определены в определении функции.

Однако, я не понимаю этого:

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

Почему выход не ("a", 2, "b", "c")? Это также соответствует шаблону, определенному в параметрах. Я искал подробное объяснение в документах, но ничего не мог найти.

Подумав некоторое время, я разработал подозрение, что он работает так:

  1. «а» согласована с p1
  2. «б» сравнивается с p2
  3. «с "не соответствует p3, потому что тогда будет несоответствие. Так он пропускается, и p3 получает значение по умолчанию, которое 3
  4. «с» согласована с p4

Может кто-нибудь подтвердить/объяснить?

редактирование: фиксированный опечаток

ответ

6

Чтобы использовать пример:

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

Если вы скомпилировать код и тип h DefaultParams.func с tab, он покажет вам

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

Не может найти хорошую ссылку на него, но я понимаю, он пытается MATCH слева направо. так и б получить соответствие, р3 не соответствует -с, потому что p4 не имеет значения, поэтому следующий вариант p4 с с