当我有一个独立于其参数的函数相关的数据时,我应该在什么时候优先使用块封装而不是本地封装?
我应该在什么时候使用:
(let [hello "Hello "]
(defn do-greet
"Print a greeting."
[name]
(println (str hello name))))对比:
(defn do-greet
"Print a greeting."
[name]
(let [hello "Hello "]
(println (str hello name))))发布于 2012-11-03 12:21:07
如果您想在词法范围内的代码块中像使用静态常量一样使用该值,那么前者是一个合理的选择。通常,您会在以下情况下执行此操作:
值的计算代价很高,并且您只希望在加载命名空间时计算一次,因为值是真正恒定的,也就是说,不会在多个函数定义中更改invocations
在大多数其他情况下,后一版本应该是首选的,它很好,原因有几个:
中使用该值的意图
发布于 2012-11-03 04:49:56
这是一种风格上的选择,它可能至少要依赖于值的计算成本。相反,请考虑:
(defn nth-prime [n] ...)
(defn f [x]
(let [factor (nth-prime 10000)]
(* x factor)))
(let [factor (nth-prime 10000)]
(defn g [x]
(* x factor)))每次调用f时重新计算昂贵的常量是浪费的,g使用一种简单的技术来避免这样做。
发布于 2012-11-03 04:07:09
如果只在一个函数中使用hello,那么将let放在函数本身中会更有意义。如果您打算在多个函数中使用hello,那么将let放在这些函数之外并围绕这些函数进行包装将是有意义的。
https://stackoverflow.com/questions/13201605
复制相似问题