Вам не нужно ключевое слово end
, если вы используете однострочную функцию.Для создания однострочной функции вы используете do
с предыдущей командой и завершающим двоеточием.Следующие функции одинаковы:
# Single line
def say_hello(name), do: IO.puts("Hello #{name}")
# Multiline
def say_hello(name) do
IO.puts("Hello #{name}")
end
Для вашего другого вопроса все определения apply_param/2
являются примером сопоставления с образцом.Каждая функция сопоставляется с другим параметром, который применяется в операторе reduce
в первой функции.
Список параметров может выглядеть следующим образом:
[{:limit, 5}, {:order, :asc}]
Так чтоВызов Reducer будет вызываться примерно так:
Enum.reduce([{:limit, 5}, {:order, :asc}], score, &apply_param/2)
Каждый параметр будет применяться к счету, возвращая измененный счет для следующей итерации функции Reduce.
{:limit, 5}
параметр будет соответствовать первой функции, в то время как {:order, :asc}
не будет соответствовать первой функции, но будет соответствовать второй функции.
def apply_param({:limit, num}, queryable), do: queryable |> limit(^num)
def apply_param({:order, field}, queryable), do: queryable |> order_by(desc: ^field)
def apply_param({:player_id, player_id}, queryable),
do: queryable |> where(player_id: ^player_id)
def apply_param(_param, queryable), do: queryable
В последней функции нижнее подчеркивание в _param
означаетчто это будет соответствовать чему угодно.Как правило, это хорошая идея: иметь регистр по умолчанию для неизвестного ввода.
Вот пример того, что я часто делаю, который демонстрирует обе эти вещи:
# This function declaration without a body is called a header, it is used so # I don't have define the default value of 5 in multiple places
def fetch_data(id, retries_left \\ 5)
# In this case, where the retries_left matches on the value of 0, I want to
# raise an error. Since this is small, I use a one-line function
def fetch_data(id, 0), do: raise "Retries exhausted, could not fetch data!"
# In any other case, try getting the data again
def fetch_data(id, retries_left) do
case do_request(id)
# It didn't work, decrement and try again, this will eventually get us to 0
{:error, _} -> fetch_data(id, retries_left - 1)
# It works! Return the payload
{:ok, payload} -> payload
end
end