Може хто - небудь пояснити різницю між use
і require
, як при використанні безпосередньо і , як :use
і :require
в ns
макро?
Може хто - небудь пояснити різницю між use
і require
, як при використанні безпосередньо і , як :use
і :require
в ns
макро?
Відповіді:
require
вантажі ЛІЕС (які ще не завантажені), use
робить те ж саме , плюс це відноситься до їх просторів імен з clojure.core/refer
(так що ви також отримуєте можливість використання і :exclude
т.д. , як з clojure.core/refer
). Обидва рекомендується використовувати, ns
а не безпосередньо.
Ідіоматично включати зовнішні функції за допомогою require
та refer
. Ви уникаєте конфліктів у просторі імен, включаєте лише функції, які ви фактично використовуєте / потребуєте, і ви явно декларуєте місцезнаходження кожної функції:
(ns project.core
(:require [ring.middleware.reload :refer [wrap-reload]]))
Мені не потрібно викликати цю функцію, префіксуючи її простором імен:
(wrap-reload) ; works
Якщо ви не використовуєте, refer
вам потрібно буде встановити префікс простору імен:
(ring.middleware.reload/wrap-reload) ; works if you don't use refer in your require
Якщо ви виберете use
замість цього, (в значній мірі) завжди використовуйте only
:
(ns project.core
(:use [ring.middleware.reload :only [wrap-reload]]))
Інакше ви включаєте все, роблячи це як зайво великою операцією, так і дуже заплутаною для інших програмістів, щоб знайти, де функціонують функції.
Також я дуже рекомендую цей блог як ресурс для отримання більш детальної інформації про простори імен Clojure.
(:use foo :only [bar])
і (:require foo :refer [bar])
? Здається, дивним є два способи зробити це.
(:require .. :refer ..)
це новий спосіб зробити те саме, що дозволяє ефективно застаріти :use
, що має деякі недоліки.
Переконайтеся, що це полегшує ситуацію, не вимагаючи, щоб ви прописували простір імен кожного разу, коли ви хочете викликати функцію, хоча це також може створювати безлад, створюючи конфлікти у просторі імен. Хорошим середнім середовищем між "використання" та "вимагати" є лише "використання" функцій з простору імен, які ви фактично використовуєте.
наприклад:
(використовуйте '[clojure-contrib.duck-потоки: тільки (читач читачів)])а ще краще, вкажіть його у верхній частині файлу у визначенні простору імен:
(ns com.me.project (: використовуйте [clojure.contrib.test-is: only (deftest is run-testing)]))
(ns ...)
синтаксису; Я шукав це, але всі знайдені нами приклади були зрозумілими (use ...)
.
(require '[namepase :refer [var-name1 var-name2]])
Як вже згадувалося, велика різниця полягає в тому, що з (require 'foo)
, потім ви посилаєтесь на імена в просторі імен lib так: (foo/bar ...)
якщо ви це зробите, (use 'foo)
вони тепер знаходяться у вашому поточному просторі імен (що б там не було, і за умови, що немає конфліктів), і ви можете зателефонувати їм подобається (bar ...)
.