我看到了下面的一段代码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}})那么这个symbol ->有什么不同之处呢?为什么它在用户定义的命名空间之后?
我知道作为一个宏,->习惯于
(-> 4 (+ 5)
(- 6))它翻译成(- (+ 4 5) 6)并给出3.但我也不能谷歌一个'->‘或键入类似于搜索这是什么意思的东西。
发布于 2013-11-15 15:33:29
在命名空间中使用defrecord声明RedisTokenStore。
在defrecord doc的底部
给定
(defrecord TypeName ...),将定义两个工厂函数:->TypeName,获取字段的位置参数;以及->TypeName,获取关键字到字段值的映射。
发布于 2013-11-15 15:35:59
->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工厂函数,它将地图作为其唯一的参数。
https://stackoverflow.com/questions/19995366
复制相似问题