在此示例中(来自此处):
(defmethod event-msg-handler :chsk/recv
[{:as ev-msg :keys [?data]}]
(logf "Push event from server: %s" ?data)))
其中
?data
是 vector
,?
有什么目的或表示什么吗?
问号不会改变 Clojure 读取或评估符号的方式。 Clojure 处理包含问号的符号与不包含问号的符号完全相同。
因此,在
?
符号中使用 ?data
只是 Sente 库作者使用的命名约定。
通常,符号中的标点符号是一种命名约定。尾随的
?
通常表示谓词函数或某个布尔标志。
核心 api 中的示例包括
map?
和 number?
。一个例子可能如下所示:
=> (filter number? [1 "foo" 2 :bar])
(1 2)
=> (remove number? [1 "foo" 2 :bar])
("foo" :bar)
=> (def debug? true)
(when debug? (println "Debugging")
尾随的
!
通常表示正在发生一些就地突变,例如
=>(def an-atom (atom 0))
=> @an-atom
0
=> (reset! an-atom 10)
=> @an-atom
10
然而,一些库确实附加了更进一步的含义。例如,cascalog 使用前导
?
!!
和 !
来指示查询输出变量的一些不同属性。请参阅Cascalog 文档了解更多信息