Clojure命名空间中use与require的区别

简介: <p><span style="font-size:18px">这个问题的答案来自于stackoverflow,老外人家回答问题就是细心、认真,学习一下。<br> A:Can anyone explain the difference between use and require, both when used directly and as:use and :require in t

这个问题的答案来自于stackoverflow,老外人家回答问题就是细心、认真,学习一下。
A:Can anyone explain the difference between use and require, both when used directly and as:use and :require in the ns macro?
B:require loads libs (that aren't already loaded), use does the same plus it refers to their namespaces with clojure.core/refer (so you also get the possibility of using :exclude etc like withclojure.core/refer). Both are recommended for use in ns rather than directly.
A:If I require lib foo, then to use bar in foo, I'd have to write foo/bar every time, right? Why would you want to load a lib in ns but then not refer it into the ns? I guess you might be worried about collisions, and you don't want to bother having to reconcile them, right?
B:not having to reconcile collisions is a good point, and more generally there's a programming style which says "namespaces are a honking great idea, we should have more of them" (from "The Zen of Python") -- so e.g. that style recommends not using "using namespace foo;" in C++, so that readers and maintainers of the code won't have to worry "where does this bar come from" but see a more explicit foo::bar instead. require (vs use) supports this "explicit namespaces" style.


总结一下:

use就是在当前项目中引用别的项目时,通过clojure.core/refer把其他项目的函数变量等引入当前项目的工作空间中来,这样在引用其他项目中的函数时就不用再写项目名了。
require比use功能少些,不把别的项目引入当前工作空间,在引用别的项目的函数时需要写全项目名+函数名。

至于其中的原因,老外说的很清楚了。that style recommends not using "using namespace foo;" in C++, so that readers and maintainers of the code won't have to worry 

扩展阅读:

http://stackoverflow.com/questions/3408076/difference-in-clojure-between-use-and-require

http://stackoverflow.com/questions/871997/difference-between-use-and-require



目录
相关文章
|
Go
Go 语言的作用域规则及其特点
Go 语言的作用域规则及其特点
167 41
Go 语言的作用域规则及其特点
|
5月前
|
Unix 编译器 Go
|
7月前
|
Rust 编译器
Rust代码组织:Package、Crate、Module
Rust代码组织:Package、Crate、Module
|
8月前
|
PHP 开发者
深入PHP命名空间:代码模块化和避免冲突
【5月更文挑战第26天】在现代PHP开发中,命名空间是实现代码模块化、防止类名和函数名冲突的关键技术。本文将深入探讨PHP命名空间的概念、实现原理及其在实际项目中的应用,帮助开发者更好地理解和使用命名空间,提高代码的可维护性和可扩展性。
|
8月前
|
关系型数据库 MySQL PHP
深入探讨PHP中的命名空间和自动加载机制
【4月更文挑战第18天】在PHP的编程世界中,命名空间和自动加载机制是两个关键的概念,它们不仅有助于代码的组织和维护,而且对于实现高效的模块化编程至关重要。本文将详细探讨PHP命名空间的作用、如何正确使用它们以及自动加载机制的原理和实践,帮助开发者提升代码的可读性和可维护性,同时减少内存资源的消耗。
35 0
|
8月前
|
Rust 编译器
【Rust】——package、crate、定义Module
【Rust】——package、crate、定义Module
PHP的命名空间是干什么的?底层原理是什么?
PHP的命名空间是干什么的?底层原理是什么?
137 0
|
Shell PHP
关于php创建扩展的一个坑:找不到skeleton
关于php创建扩展的一个坑:找不到skeleton
119 0
关于php创建扩展的一个坑:找不到skeleton
|
PHP Python
ActiveRecord语言实现PHP、Python、Node.js
ActiveRecord语言实现PHP、Python、Node.js
143 0
ActiveRecord语言实现PHP、Python、Node.js
PHP:Trait简单使用
PHP:Trait简单使用