Bất cứ ai cũng có thể giải thích sự khác biệt giữa use
và require
, cả khi được sử dụng trực tiếp và như :use
và :require
trong ns
macro?
Bất cứ ai cũng có thể giải thích sự khác biệt giữa use
và require
, cả khi được sử dụng trực tiếp và như :use
và :require
trong ns
macro?
Câu trả lời:
require
tải libs (chưa được tải), use
thực hiện tương tự cộng với nó đề cập đến không gian tên của chúng với clojure.core/refer
(vì vậy bạn cũng có thể sử dụng :exclude
vv như với clojure.core/refer
). Cả hai đều được khuyến nghị sử dụng ns
thay vì trực tiếp.
Nó là thành ngữ để bao gồm các chức năng bên ngoài với require
và refer
. Bạn tránh xung đột không gian tên, bạn chỉ bao gồm các chức năng bạn thực sự sử dụng / cần và bạn tuyên bố rõ ràng từng vị trí của chức năng:
(ns project.core
(:require [ring.middleware.reload :refer [wrap-reload]]))
Tôi không phải gọi hàm này bằng cách thêm tiền tố vào không gian tên của nó:
(wrap-reload) ; works
Nếu bạn không sử dụng, refer
bạn cần phải thêm tiền tố vào không gian tên:
(ring.middleware.reload/wrap-reload) ; works if you don't use refer in your require
Nếu bạn chọn use
thay thế, (khá nhiều) luôn sử dụng only
:
(ns project.core
(:use [ring.middleware.reload :only [wrap-reload]]))
Mặt khác, bạn bao gồm tất cả mọi thứ, làm cho nó trở thành một hoạt động lớn không cần thiết và rất khó hiểu cho các lập trình viên khác để tìm nơi các chức năng sống.
Ngoài ra, tôi đánh giá cao blog này như một tài nguyên để tìm hiểu thêm về không gian tên Clojure.
(:use foo :only [bar])
và giữa (:require foo :refer [bar])
không? Có vẻ kỳ quặc để có hai cách để làm điều này.
(:require .. :refer ..)
là một cách mới để làm điều tương tự cho phép bạn phản đối một cách hiệu quả :use
, có một số nhược điểm.
Sử dụng chắc chắn sẽ làm cho nó dễ dàng hơn bằng cách không yêu cầu bạn đánh vần không gian tên mỗi khi bạn muốn gọi một hàm mặc dù nó cũng có thể tạo ra sự lộn xộn của mọi thứ bằng cách tạo xung đột không gian tên. Một nền tảng tốt giữa "sử dụng" và "yêu cầu" là chỉ "sử dụng" các chức năng từ một không gian tên mà bạn thực sự sử dụng.
ví dụ:
(sử dụng '[clojure-contrib.duck-stream: only (người đọc nhà văn)])hoặc thậm chí tốt hơn, chỉ định nó ở đầu tệp trong định nghĩa không gian tên:
(ns com.me.project (: sử dụng [clojure.contrib.test-is: only (deftest là run-tests)]))
(ns ...)
cú pháp; Tôi đã tìm kiếm điều đó nhưng tất cả các ví dụ tôi tìm thấy đều đơn giản (use ...)
.
(require '[namepase :refer [var-name1 var-name2]])
Như đã đề cập, sự khác biệt lớn là với (require 'foo)
, sau đó bạn tham khảo các tên trong không gian tên của lib như vậy: (foo/bar ...)
nếu bạn làm như vậy (use 'foo)
thì bây giờ chúng đang ở trong không gian tên hiện tại của bạn (bất cứ điều gì có thể và miễn là không có xung đột) và bạn có thể gọi họ thích (bar ...)
.