Adakah yang bisa menjelaskan perbedaan antara use
dan require
, baik ketika digunakan secara langsung dan sebagai :use
dan :require
di ns
makro?
Adakah yang bisa menjelaskan perbedaan antara use
dan require
, baik ketika digunakan secara langsung dan sebagai :use
dan :require
di ns
makro?
Jawaban:
require
load libs (yang belum dimuat), use
melakukan plus yang sama mengacu pada namespace mereka dengan clojure.core/refer
(jadi Anda juga mendapatkan kemungkinan menggunakan :exclude
dll suka dengan clojure.core/refer
). Keduanya direkomendasikan untuk digunakan ns
daripada langsung.
Adalah idiomatis untuk memasukkan fungsi eksternal dengan require
dan refer
. Anda menghindari konflik namespace, Anda hanya menyertakan fungsi yang sebenarnya Anda gunakan / butuhkan, dan Anda secara eksplisit menyatakan lokasi masing-masing fungsi:
(ns project.core
(:require [ring.middleware.reload :refer [wrap-reload]]))
Saya tidak harus menjalankan fungsi ini dengan mengawalinya dengan namespace-nya:
(wrap-reload) ; works
Jika Anda tidak menggunakannya, refer
Anda harus membuatnya awalan dengan namespace:
(ring.middleware.reload/wrap-reload) ; works if you don't use refer in your require
Jika Anda memilih use
sebagai gantinya, (cukup banyak) selalu menggunakan only
:
(ns project.core
(:use [ring.middleware.reload :only [wrap-reload]]))
Kalau tidak, Anda memasukkan semuanya, menjadikannya sebuah operasi besar yang tidak perlu dan sangat membingungkan bagi programmer lain untuk menemukan di mana fungsinya.
Juga, saya sangat merekomendasikan blog ini sebagai sumber untuk mempelajari lebih lanjut tentang ruang nama Clojure.
(:use foo :only [bar])
dan (:require foo :refer [bar])
? Tampaknya aneh memiliki dua cara untuk melakukan ini.
(:require .. :refer ..)
adalah cara baru untuk melakukan hal yang sama yang memungkinkan Anda untuk secara efektif terdepresiasi :use
, yang memiliki beberapa kelemahan.
Penggunaan tentu membuat lebih mudah dengan tidak mengharuskan Anda untuk mengeja namespace setiap kali Anda ingin memanggil fungsi meskipun itu juga dapat membuat kekacauan dengan menciptakan konflik namespace. Jalan tengah yang baik antara "gunakan" dan "perlu" adalah dengan hanya 'menggunakan' fungsi-fungsi dari namespace yang sebenarnya Anda gunakan.
misalnya:
(gunakan '[clojure-contrib.duck-stream: only (writer reader)])atau bahkan lebih baik, tentukan di bagian atas file dalam definisi namespace:
(proyek ns com.me. (: gunakan [clojure.contrib.test-is: only (deftest run-tes)]))
(ns ...)
sintaksis; Saya telah mencari-cari itu tetapi semua contoh yang saya temukan jelas (use ...)
.
(require '[namepase :refer [var-name1 var-name2]])
Seperti telah disebutkan perbedaan besar adalah dengan (require 'foo)
, Anda kemudian merujuk nama-nama di namespace lib seperti: (foo/bar ...)
jika Anda melakukannya (use 'foo)
maka mereka sekarang di namespace Anda saat ini (apa pun yang mungkin dan asalkan tidak ada konflik) dan Anda dapat memanggil mereka suka (bar ...)
.