我正在研究以下功能:
(defn process-request [request]
(if (not (db/empty?))
{:person (db/get-person!) :violations (:violations (process-violations request))}
{:person {} :violations ["no-person"]}))
我需要 process-violations
函数只在数据库不为空时被调用。这就是它位于 if
block 中的原因。
但是,我还需要在 db/get-person!
函数 之前调用它。否则,该值将过时。
所以我想知道:
- 我该怎么做?
- 无论如何,映射中值的顺序是否足以保证一个函数总是在另一个函数之前被调用?
最佳答案
不, map 没有排序。对于小型文字 map ,它可能会起作用,但你不应该依赖它,而对于更大的 map ,它确实会失败:
user=> {0 (println 0) 1 (println 1) 2 (println 2) 3 (println 3) 4 (println 4) 5 (println 5) 6 (println 6) 7 (println 7) 8 (println 8) 9 (println 9)}
0
7
1
4
6
3
2
9
5
8
{0 nil, 7 nil, 1 nil, 4 nil, 6 nil, 3 nil, 2 nil, 9 nil, 5 nil, 8 nil}
但是通过使用 let
绑定(bind)总是很容易强制排序,这些绑定(bind)在 let
主体之前按顺序计算。
(let [person (db/get-person!)]
{:person person :violations ...})
关于clojure - Clojure 映射中的函数调用顺序是否保证运行时顺序处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69020254/