Clojure笔记

来源:互联网 发布:淘宝男装店名 编辑:程序博客网 时间:2024/05/17 01:05
1、在clojure中的函数命名规范,def functionName表示该函数是public的,例如: def -main[],调用该函数的时候,不需要加-,直接使用main即可。与此相对的是defn- functionName,这个表示该函数时私有函数,不可以在外部调用。
2、clojure中调用java方法:
首先使用(:import [packageName ClassName])导入该方法所在的java类
   a、调用一个类的静态方法:(ClassName/staticFunctionName arg1 arg2 ...) 例如:
(Utils/newCuratorconf servers port root)
   b、调用一个实例的方法(使用句点):(.functionName instanceName arg1 arg2 ...) ,例如:
(.serializeserializer tuple)这里调用了serializer的实例方法serialize,该方法接收一个tuple参数。
句点可以用来访问实例方法和访问字段。
3、clojure中创建一个java类的实例的方法
  * 首先使用(:import [packageName ClassName])导入该java类,例如:
(:import[org.apache.storm.messaging TaskMessage])
  * 然后使用   (instanceName (ClassName. arg1 agr2 ...)) ,后面的参数arg1、arg2等是这个类的构造函数的参数,例如:
(remote (TaskMessage.task tupleBytes))这里接受task与tupleBytes两个参数作为构造函数的参数创建了一个TaskMessage对象 并且赋值给了remote。
还有一种方式就是直接new的方式:例如(def rnd (new java.util.Random))这里就创建了一个Random的对象并且赋值给了rnd
4、clojure中声明一个java类类型的变量的方法:
*同样先要导入该类
*然后使用 ^ClassName varName 表示varName的类型是ClassName类类型的,例如:
(^ArrayList list)
5、此外,在一个clojure文件中访问另外一个.clj文件中的方法的方式,与访问java类的静态方法的方式一样,先导入该.clj,然后使用(FileName/functionName agr1 arg2 arg3 ...),例如:
(adder/add 3 4) 这里调用了add.clj中定义的add方法 该方法接收两个参数3 和4 。
6、在clojure中 reify是一个关键字,它用于实现接口或者协议的匿名对象,eg:
(reify Person (........))