Bất cứ ai cũng có thể giải thích sự khác biệt giữa usevà require, cả khi được sử dụng trực tiếp và như :usevà :requiretrong nsmacro?
Bất cứ ai cũng có thể giải thích sự khác biệt giữa usevà require, cả khi được sử dụng trực tiếp và như :usevà :requiretrong nsmacro?
Câu trả lời:
requiretải libs (chưa được tải), usethự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 :excludevv như với clojure.core/refer). Cả hai đều được khuyến nghị sử dụng nsthay 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 requirevà 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, referbạ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 usethay 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 ...).