Существует несколько способов предоставления необязательных аргументов и их значений по умолчанию.Какой из них выбрать, зависит от того, как вы хотите предоставить эти необязательные аргументы для вызова функции.
Строго последовательные аргументы
Ваши аргументы уже упорядочены путем уменьшения вероятности их установки.Вы хотите иметь возможность вызывать функцию следующим образом (при условии, что тело функции println
и игнорирование возвращаемого значения nil
):
user> (get-user-projects-by-user-id :conn :uid)
[:conn :uid asc nil 10 10]
user> (get-user-projects-by-user-id :conn :uid :sort)
[:conn :uid :sort nil 10 10]
user> (get-user-projects-by-user-id :conn :uid :sort "filter")
[:conn :uid :sort filter 10 10]
user> (get-user-projects-by-user-id :conn :uid :sort "filter" 9)
[:conn :uid :sort filter 9 10]
Для этого вы можете перегрузить функцию с помощью arity, так как выуже началось:
(defn get-user-projects-by-user-id
([db-conn userid]
(get-user-projects-by-user-id db-conn userid
(str "asc")
nil
10
10))
([db-conn userid sort]
(get-user-projects-by-user-id db-conn userid
sort
nil
10
10))
([db-conn userid sort filters]
(get-user-projects-by-user-id db-conn userid
sort
filters
10
10))
([db-conn userid sort filters offset]
(get-user-projects-by-user-id db-conn userid
sort
filters
offset
10))
([db-conn userid sort filters offset size]
(println [db-conn userid sort filters offset size])))
Это немного утомительно в определении функции, и вы должны позаботиться о рефакторинге, чтобы сохранить правильные значения по умолчанию.
Необязательные аргументы в качестве карты
Вы можете использовать деструктурирование в векторе аргументов, чтобы разрешить передачу карты с дополнительными аргументами.Это позволяет передавать их в любом порядке: вы можете переопределить offset
, не пропуская sort
и другие, также:
(defn get-user-projects-by-user-id-extra-map
[db-conn userid & [{:keys [sort filters offset size]
:or {sort "asc"
filters nil
offset 10
size 10}}]]
(println [db-conn userid sort filters offset size]))
Вы используете его так:
user> (get-user-projects-by-user-id-extra-map :conn :uid {:offset 9})
[:conn :uid asc nil 9 10]
Необязательные аргументы как пары
Если вы немного измените деструктуризацию (обратите внимание на отсутствующие []
), это позволит вам передавать необязательные аргументы в виде пар ключ-значение без необходимости в карте.Обычно это проще использовать, когда все вызовы функций являются явными, тогда как предыдущий параметр часто проще, когда вы apply
ваша функция с программно собранными дополнительными аргументами.
(defn get-user-projects-by-user-id-pairs
[db-conn userid & {:keys [sort filters offset size]
:or {sort "asc"
filters nil
offset 10
size 10}}]
(println [db-conn userid sort filters offset size]))
Используйте ее (примечание отсутствует {}
):
user> (get-user-projects-by-user-id-pairs :conn :uid :offset 9)
[:conn :uid asc nil 9 10]