0

我在这里看到了以下一段代码

  (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。但我也不能谷歌搜索“->”或键入类似的内容来搜索这意味着什么。

4

2 回答 2

7

RedisTokenStore在命名空间中声明为 with defrecord

defrecord文档的底部:

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

于 2013-11-15T07:33:28.787 回答
6

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

这是来自官方 Clojure 数据类型文档的引用:

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

所以,->RedisTokenStore是一个简单地调用RedisTokenStore.构造函数的辅助函数。唯一的区别是你应该import RedisTokenStore类显式调用它的构造函数,while->RedisTokenStore是一个普通函数,可以被require'ed 然后用作redis-store命名空间的一部分。

更新:正如mattexx 在他的回答中指出的那样,还有map->RedisTokenStore一个工厂函数将地图作为其唯一参数。

于 2013-11-15T07:35:58.557 回答