Herkes hem doğrudan hem de makro olarak ve makroda kullanıldığında use
ve arasındaki farkı açıklayabilir mi?require
:use
:require
ns
Herkes hem doğrudan hem de makro olarak ve makroda kullanıldığında use
ve arasındaki farkı açıklayabilir mi?require
:use
:require
ns
Yanıtlar:
require
yükler libs (zaten yüklü değil), use
aynı artı ile onların ad alanlarına atıfta bulunur clojure.core/refer
(böylece :exclude
vb ile kullanma olasılığını da elde edersiniz clojure.core/refer
). Her ikisinin de ns
doğrudan yerine kullanılması önerilir .
require
Ve ile harici işlevleri dahil etmek deyimseldir refer
. Ad alanı çakışmalarını önler, yalnızca gerçekten kullandığınız / ihtiyacınız olan işlevleri dahil edersiniz ve her işlevin konumunu açıkça bildirirsiniz:
(ns project.core
(:require [ring.middleware.reload :refer [wrap-reload]]))
Bu işlevi kendi ad alanı ile ön ek olarak çağırmak zorunda değilsiniz:
(wrap-reload) ; works
Eğer kullanmazsanız refer
, ad alanı ile ön ek yapmanız gerekir:
(ring.middleware.reload/wrap-reload) ; works if you don't use refer in your require
Seçerseniz use
yerine, (hemen hemen) her zaman kullanmak only
:
(ns project.core
(:use [ring.middleware.reload :only [wrap-reload]]))
Aksi takdirde, her şeyi dahil edersiniz, hem gereksiz yere büyük bir işlem yapar hem de diğer programcılar için işlevlerin nerede yaşadığını bulması çok kafa karıştırıcıdır.
Ayrıca, bu blogu Clojure ad alanları hakkında daha fazla bilgi edinmek için bir kaynak olarak tavsiye ederim .
(:use foo :only [bar])
ve arasında herhangi bir fark olup olmadığını biliyor musunuz (:require foo :refer [bar])
? Bunu yapmanın iki yolu var gibi görünüyor.
(:require .. :refer ..)
Aynı şeyi yapmanın etkili bir şekilde kullanımdan kaldırmanıza izin :use
veren, bazı dezavantajları olan yeni bir yoludur .
Bir işlevi her çağırmak istediğinizde ad alanını hecelemenize gerek kalmadan emin olun, ancak ad alanı çakışmaları oluşturarak bir şeyler karıştırabilirsiniz. "Use" ve "requir" arasındaki iyi bir orta yol, gerçekte kullandığınız bir ad alanından işlevleri 'kullanmak'tır.
Örneğin:
('[clojure-particip.duck-streams: only (writer reader)]' i kullanın)veya daha iyisi, ad alanı tanımında dosyanın üstünde belirtin:
(ns com.me.project (: [clojure.contrib.test-is: only (deftest çalışma testleri)] kullanın)))
(ns ...)
Sözdizimini (pun) eklediğiniz için teşekkür ederiz ; Bunu arıyordum ama bulduğum tüm örnekler açıktı (use ...)
.
(require '[namepase :refer [var-name1 var-name2]])