Herkes hem doğrudan hem de makro olarak ve makroda kullanıldığında useve arasındaki farkı açıklayabilir mi?require:use:requirens
Herkes hem doğrudan hem de makro olarak ve makroda kullanıldığında useve arasındaki farkı açıklayabilir mi?require:use:requirens
Yanıtlar:
requireyükler libs (zaten yüklü değil), useaynı artı ile onların ad alanlarına atıfta bulunur clojure.core/refer(böylece :excludevb ile kullanma olasılığını da elde edersiniz clojure.core/refer). Her ikisinin de nsdoğrudan yerine kullanılması önerilir .
requireVe 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 useyerine, (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 :useveren, 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]])