首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Clojure中,记录的名称前跟着名称空间的->是什么意思?

在Clojure中,记录的名称前跟着名称空间的->是什么意思?
EN

Stack Overflow用户
提问于 2013-11-15 15:05:35
回答 2查看 125关注 0票数 0

我看到了下面的一段代码here

代码语言:javascript
复制
  (def token-store
      (redis-store/->RedisTokenStore secret-key 30 {:pool {} :spec {:host "127.0.0.1" :port 6379}}))

有人能解释一下这是什么意思吗?

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

代码语言:javascript
复制
(RedisTokenStore. secret-key 30 {:pool {} :spec {:host "127.0.0.1" :port 6379}})

那么这个symbol ->有什么不同之处呢?为什么它在用户定义的命名空间之后?

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

代码语言:javascript
复制
(-> 4 (+ 5)
      (- 6))

它翻译成(- (+ 4 5) 6)并给出3.但我也不能谷歌一个'->‘或键入类似于搜索这是什么意思的东西。

EN

回答 2

Stack Overflow用户

发布于 2013-11-15 15:33:29

在命名空间中使用defrecord声明RedisTokenStore

defrecord doc的底部

给定

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

票数 7
EN

Stack Overflow用户

发布于 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工厂函数,它将地图作为其唯一的参数。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19995366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档