最近在看 <clojure 编程> 这本书,在使用 `Ring` 时,#’app 这样的写法时什么意思?

clojure
;; 定义 ring 的处理函数 (defn app [{:keys [uri]}] ... ;省略具体代码 ;; 在调用时 (def server (run-jetty #'app {:port 8080 :join? false}))

请问,爱调用处理函数时的 #'app 这样的写法时什么意思呢?
我试过直接写 app 也可以成功启动jetty

阅读 3.2k
1 个回答

#' 代表 var 本身。在 repl 中尝试下列代码:

clojure(def a [3 1])
(class a)
=> clojure.lang.PersistentVector
(class #'a)
=> clojure.lang.Var

大多数情况下,我们使用 var 是使用它的内容,但在你的例子中有下面重大区别:

  • var 是可以被重新定义的。例如用 alter-var-root 可以重新定义 #'app 成为另一个函数。让 jetty 的 handler 可以在运行时改变。
  • var 上所附着的元数据和它指向的内容是不同的。