我正在尝试在风暴服务器上部署拓扑,它不断告诉我以下内容:
java.lang.RuntimeException: java.lang.IllegalStateException: Attempting to call unbound fn: #'storm-nblabla/operation-bolt__ at backtype.storm.clojure.ClojureBolt.prepare(ClojureBolt.java:60) a
所以我想我必须在 准备 函数中绑定我正在使用的函数。所以我的问题是你如何在clojure中绑定函数?
此致
贺
答案 0 :(得分:11)
在clojure中,值通常以两种方式之一绑定:
本地人,没有名称空间限定符(通常在let
语句或fn
/ loop
args)
这适用于未在块范围之外引用的值(除非它们作为块内部函数或块的返回值的参数提供)。
vars,具有命名空间范围,通常使用def
(或像defn
这样的辅助宏)
这适用于应在命名空间范围内访问的值,只要您可以访问命名空间,就可以访问这些值。
错误(尝试调用未绑定的fn)是由于使用declare
创建var,然后在不提供真正定义的情况下调用它而引起的:
user> (declare foo)
#'user/foo
user> (foo)
IllegalStateException Attempting to call unbound fn: #'user/foo clojure.lang.Var$Unbound.throwArity (Var.java:43)
在此代码中,var存在(declare
已创建它),但未分配任何值。
所以你需要后一种绑定,一种var绑定:
user> (defn foo [] "OK")
#'user/foo
user> (foo)
"OK"
user>
某处,您的代码的某些部分或您正在使用的库的代码声明了一个var,它应绑定到可调用的值,但尚未正确初始化。该库是否具有您未调用的某种init
函数?在定义可见之前,您可能需要命名空间吗?