Clojure Web应用中随机化函数调用后不再随机的问题求助
问题根源
你用def定义make-board时,会在应用启动阶段仅执行一次board/setup-board,并把生成的棋盘结果缓存为全局变量。后续所有访问/make-board的请求,都会直接返回这个预先计算好的缓存值,自然不会重新生成随机棋盘。把setup-board改为动态变量没用——根本问题是结果被提前固化,和变量作用域无关。
解决方案
把make-board从全局变量改成函数,让每次请求进来时都重新执行board/setup-board:
(defn make-board [] ; 改为函数定义 {:status 200 :headers {"Content-Type" "text/html"} :body (str (board/setup-board))})
同时修改路由,确保请求触发时调用这个函数:
(defroutes app (GET "/make-board" [] (make-board)) ; 调用函数而非直接引用变量 (GET "/" [] home-page) (GET "/login" [] login) (not-found "404 not found!"))
逻辑验证
- 应用启动时,
make-board函数不会立即执行,只有当/make-board请求到达时才会触发。 - 每次请求都会重新调用
board/setup-board生成全新的随机棋盘,返回结果不再重复。
内容的提问来源于stack exchange,提问作者triplej
相关产品推荐
相关产品推荐

