【问题标题】:Clojure Best Practice: When to use Metadata?Clojure 最佳实践:何时使用元数据?
【发布时间】:2014-04-15 19:57:42
【问题描述】:

我并不是说这是一个主观问题——我试图理解为什么 with-meta 是在该语言中。我意识到它可以用于多种用途(eval 也可以,但它在特定情况下的使用是糟糕设计的标志)。从设计的角度来看,Clojure 的元数据结构的独特目的是什么?它主要用于文档吗?是糖吗?

with-meta/meta有哪些强大的应用?在什么情况下这是一个坏主意?你能举个例子说明使用元数据来做一些没有它就不可能/困难/乏味的事情吗?

【问题讨论】:

    标签: clojure


    【解决方案1】:

    该语言的一些核心特性依赖于元数据:

    • 宏一个依赖元数据的特性。宏是一个带有一些元数据的函数,它会导致函数在编译时运行。

      user> (meta #'when)
      
      {:macro true, 
       :ns #<Namespace clojure.core>, 
       :name when, :arglists ([test & body]), 
       :column 1, :added "1.0", 
       :doc "Evaluates test. If logical true, evaluates body in an implicit do.", 
       :line 471, 
       :file "clojure/core.clj"}
      
    • 类型是依赖于元数据的语言的另一个特性。某物的类型表示为该对象的元数据。

    • 测试也使用元数据。当您(或 lein)调用 run-tests 时,它会查看每个命名空间中函数的元数据以找到测试的函数。

    还有更多的案例,从语言的核心类型到外围的东西,比如 n-repl/cider 在您使用元数据工作时在屏幕底部显示函数参数。使用元数据当然不是一种设计气味,前提是您不使用它来做丑陋的事情;)

    【讨论】:

    • 有人知道如何让项目符号列表中的代码显示在正确的代码块中吗?
    • 你必须再缩进 4 个空格,并在项目符号文本和代码之间放置一个空行。
    • 尊重@ArthurUlfeldt,这个答案缺少肉!告诉我一些那些丑陋的事情?
    【解决方案2】:

    元数据对于将详细信息附加到不需要它的值非常有用。例如,在 Web 服务器中,您可以将元数据用于函数的端点信息(例如,调用此函数是否需要身份验证)并在您的处理程序中处理它们。例如,Ring 将元数据用于check if a session should be recreated

    【讨论】:

      【解决方案3】:

      除了上面提到的 Arthur Ulfeldt 之外,Clojure 的独特功能之一是使用元数据来扩展协议。这允许您在创建后将协议动态添加到几乎任何对象(实际上是任何值)。据我所知,大多数其他语言都没有此功能(Smalltalk 可能例外)。

      请参阅Extend via Metadata 了解更多信息。

      由于在 Clojure 中添加元数据不会影响相等语义,如果添加元数据导致您的应用程序错误地认为两个对象相等,您可能会遇到语义问题。此问题是特定于域的。

      【讨论】:

        猜你喜欢
        • 2010-11-06
        • 1970-01-01
        • 2014-02-21
        • 1970-01-01
        • 2016-07-23
        • 2012-09-04
        • 2010-09-05
        • 1970-01-01
        • 2021-08-22
        相关资源
        最近更新 更多