这是什么 - >在Clojure中的记录名称之前是命名空间吗?

时间:2013-11-15 07:05:35

标签: clojure

我见过以下代码here

  (def token-store
      (redis-store/->RedisTokenStore secret-key 30 {:pool {} :spec {:host "127.0.0.1" :port 6379}}))

任何人都可以解释这是什么意思吗?

RedisTokenStore是一个实现TokenStore协议及其方法的记录。 但是这个语法意味着什么,也可以使用这种语法创建对象:

(RedisTokenStore. secret-key 30 {:pool {} :spec {:host "127.0.0.1" :port 6379}})

然后这个符号有什么不同 - >做什么? 为什么它是在用户定义的命名空间之后?

我知道作为一个宏, - >习惯了

(-> 4 (+ 5)
      (- 6))

转换为( - (+ 4 5)6)并给出3.但我也不能谷歌' - >'或者输入类似的东西来搜索这意味着什么。

2 个答案:

答案 0 :(得分:7)

在命名空间中使用RedisTokenStore声明

defrecord

defrecord doc

的底部
  

给定(defrecord TypeName ...),将定义两个工厂函数:    - > TypeName,获取字段的位置参数,以及map-> TypeName,将关键字映射到字段值。

答案 1 :(得分:6)

->RedisTokenStore是记录RedisTokenStore的工厂函数。 Clojure在定义记录时自动定义它。

以下是official Clojure datatypes docs的引用:

  

当deftype / defrecord Foo被定义为相应的函数时 - > Foo被定义为将其参数传递给构造函数(仅版本1.3及更高版本)

因此,->RedisTokenStore是一个辅助函数,它只调用RedisTokenStore.构造函数。唯一的区别是,您应import RedisTokenStore类明确调用其构造函数,而->RedisTokenStore是普通函数,可以require编辑,然后用作其中的一部分redis-store名称空间。

更新:作为mattexx poined out in his answer,还有map->RedisTokenStore工厂函数,它将地图作为唯一参数。