ใครสามารถอธิบายความแตกต่างระหว่างuse
และrequire
ทั้งสองเมื่อใช้โดยตรงและเป็น:use
และ:require
ในns
มาโคร
ใครสามารถอธิบายความแตกต่างระหว่างuse
และrequire
ทั้งสองเมื่อใช้โดยตรงและเป็น:use
และ:require
ในns
มาโคร
คำตอบ:
require
โหลด libs (ที่ไม่ได้โหลดแล้ว) use
ไม่เหมือนกันบวกมันหมายถึง namespaces ของพวกเขาด้วย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
ซึ่งมีข้อเสียอยู่บ้าง
ใช้แน่ใจว่าทำให้ง่ายขึ้นโดยไม่ต้องการให้คุณสะกด namespace ทุกครั้งที่คุณต้องการเรียกใช้ฟังก์ชันแม้ว่ามันจะสามารถทำให้สิ่งต่าง ๆ ยุ่งเหยิงโดยการสร้างเนมสเปซที่ขัดแย้งกัน พื้นกลางที่ดีระหว่าง "ใช้" และ "ต้องการ" คือการ 'ใช้' ฟังก์ชั่นจากเนมสเปซที่คุณใช้งานจริงเท่านั้น
เช่น:
(ใช้ '[clojure-contrib.duck-streams: เท่านั้น (ผู้อ่านนักเขียน)])หรือดียิ่งขึ้นระบุที่ด้านบนของไฟล์ในนิยาม namespace:
(ns com.me.project (: ใช้ [clojure.contrib.test-is: only (deftest คือ run-tests)])
(ns ...)
ไวยากรณ์ ฉันได้รับการมองหา (use ...)
แต่ตัวอย่างที่ผมพบเป็นธรรมดา
(require '[namepase :refer [var-name1 var-name2]])
ดังที่ได้กล่าวไปแล้วความแตกต่างที่สำคัญก็คือเมื่อ(require 'foo)
คุณอ้างถึงชื่อในเนมสเปซของ lib เช่น(foo/bar ...)
ถ้าคุณทำ(use 'foo)
ตอนนี้พวกเขาจะอยู่ในเนมสเปซปัจจุบันของคุณ (ไม่ว่าจะเป็นอะไรก็ตาม (bar ...)
พวกเขาชอบ