首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数据块封装与本地封装- let

数据块封装与本地封装- let
EN

Stack Overflow用户
提问于 2012-11-03 03:11:21
回答 4查看 178关注 0票数 6

当我有一个独立于其参数的函数相关的数据时,我应该在什么时候优先使用块封装而不是本地封装?

我应该在什么时候使用:

代码语言:javascript
运行
复制
(let [hello "Hello "]
  (defn do-greet
    "Print a greeting."
    [name]
    (println (str hello name))))

对比:

代码语言:javascript
运行
复制
(defn do-greet
  "Print a greeting."
  [name]
  (let [hello "Hello "]
    (println (str hello name))))
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-11-03 12:21:07

如果您想在词法范围内的代码块中像使用静态常量一样使用该值,那么前者是一个合理的选择。通常,您会在以下情况下执行此操作:

值的计算代价很高,并且您只希望在加载命名空间时计算一次,因为值是真正恒定的,也就是说,不会在多个函数定义中更改invocations

  • The值将在多个函数定义中使用(即,将多个block)

  • (Possibly?)放入
  • 中因为您希望在宏扩展中使用该值,而将let嵌入到宏扩展本身中会增加不必要的复杂性。

在大多数其他情况下,后一版本应该是首选的,它很好,原因有几个:

  • 它更惯用
  • 它允许函数定义在顶层,这更有利于代码的可读性/ comprehension
  • It允许值在不同的函数上变化invocations
  • It更好地反映了在本地上下文

中使用该值的意图

票数 6
EN

Stack Overflow用户

发布于 2012-11-03 04:49:56

这是一种风格上的选择,它可能至少要依赖于值的计算成本。相反,请考虑:

代码语言:javascript
运行
复制
(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使用一种简单的技术来避免这样做。

票数 5
EN

Stack Overflow用户

发布于 2012-11-03 04:07:09

如果只在一个函数中使用hello,那么将let放在函数本身中会更有意义。如果您打算在多个函数中使用hello,那么将let放在这些函数之外并围绕这些函数进行包装将是有意义的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13201605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档