Hor*_*ace 6 clojure apache-storm
我正在尝试在风暴服务器上部署拓扑,它不断告诉我以下内容:
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
Run Code Online (Sandbox Code Playgroud)
所以我想我必须绑定一个我在prepare函数中使用的函数.所以我的问题是你如何在clojure中绑定函数?
问候,
贺拉斯
noi*_*ith 11
在clojure中,值通常以两种方式之一绑定:
locals,没有命名空间限定符,(通常在let语句或fn/ loopargs中)
这适用于未在块范围之外引用的值(除非它们作为块内部函数或返回值的参数提供)块的价值).
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)
Run Code Online (Sandbox Code Playgroud)
在此代码中,var存在(declare创建它),但没有赋值.所以你需要后一种绑定,一个var绑定:
user> (defn foo [] "OK")
#'user/foo
user> (foo)
"OK"
user>
Run Code Online (Sandbox Code Playgroud)
在某处,代码的某些部分或您正在使用的库的代码声明了一个var,它应绑定到一个可调用的值,但尚未正确初始化.该库是否具有init您尚未调用的某种功能?也许在定义可见之前需要一个命名空间?