阿小信大人的头像
做你说过的,说你能做的 阿小信大人

[转]Clojure中require、use和import的区别2016-03-16 16:51

关于require

require只负责引入clojure库,不绑定函数到当前的ns中。

;;引入java io,并指定缩略名为io
(require '[clojure.java.io :as io])
;;使用
(io/file "Filename")

;;在ns中使用
(ns test
  (:require [clojure.java.io :as io]))

Require, 等同python import

关于refer

将函数绑定到当前的ns中。例如

;;把trim和capitalize绑定到当前的ns中,可以直接调用这两个方法
(refer 'clojure.string :only '[capitalize trim])

;;在ns中的写法
(ns test
  (:refer clojure.string :only [capitalize trim]))

关于refer-clojure

从源码可以看出,就是调用了refer

(defmacro refer-clojure
  "Same as (refer 'clojure.core <filters>)"
  {:added "1.0"}
  [& filters]
  `(clojure.core/refer '~'clojure.core ~@filters))

关于use

引入并绑定,相当于require+refer。

;;引入并绑定split方法,之后就可以直接使用了
(use '[clojure.string :only (split)])
;;直接在当前ns中使用split
(split "hello,world" #",")

;;在ns中的写法
(ns test
  (:use [clojure.string :only (split)]))

Use, 等同Python from…import

关于import

和require相似,不过import负责引入java库,require负责引入clojure库。

;;引入Clendar
(import [java.util Calendar])
;;使用
(Calendar/getInstance)

;;在ns中的写法
(ns test
  (:import [java.util Calendar]))

use在函数名称没有冲突,而且函数很常用的情况下使用比较合适。

require对于怕有名称冲突的情况下使用比较合适。

import就是用来引入java库的。

关于gen-class的片面

除了以上这些函数,ns中的gen-class也常用到,其功能就是将clojure代码编译成java class。 比如要将clojure代码打包成可执行jar包,那么指定main class就可以用上。(gen-class还有很多功能,这只是最常用的一个)

(ns test
     (:gen-class))
(defn -main [] (println "Hello, World!"))

;;编译之后,在shell中执行,打印hello, world!
java test

原文: http://clojure.iteye.com/blog/2066735

如果您觉得从我的分享中得到了帮助,并且希望我的博客持续发展下去,请点击支付宝捐赠,谢谢!

若非特别声明,文章均为阿小信的个人笔记,转载请注明出处。文章如有侵权内容,请联系我,我会及时删除。

#Clojure#  
分享到:
阅读[995] 评论[0]

本文最近访客

网友54.*.*.35[火星]2018-07-23 19:09
网友46.*.*.70[Ashburn]2018-07-23 19:07
网友203.*.*.78[韩国]2018-07-23 18:59
网友46.*.*.80[弗吉尼亚州]2018-07-23 18:59

发表评论