Product.scala trait 中 productPrefix def 的实际使用

Posted

技术标签:

【中文标题】Product.scala trait 中 productPrefix def 的实际使用【英文标题】:The practical use of productPrefix def in Product.scala trait 【发布时间】:2021-06-26 20:47:08 【问题描述】:

也许是愚蠢的问题,但我找不到任何有用的解释。我已经阅读了文档,但我很困惑,也许一种用途是在某种程度上比较类型。有什么想法或实际例子吗?

块引用

派生类的 toString 方法中使用的字符串。实现可以覆盖此方法以在 toString 方法的结果前添加字符串前缀。 回报: 在默认实现中,空字符串 块引用

【问题讨论】:

当您执行final case class Foo(data: Int) 时,编译器会自动将productPrefix 覆盖为"Foo",并由toString 在内部使用 - 如果您问何时使用它,可能永远不会。 @LuisMiguelMejíaSuárez Re "never": case class UniversalQuantification(binder: String, body: String) override def productPrefix = "\u2200" ; println(UniversalQuantification("x", "P(x)")) 虽然看起来非常整洁:∀(x,P(x)) :P 也许它实际上对于更紧凑地打印 AST 有点有用,同时保持类名可键入。 @AndreyTyukin 这是一个巧妙的技巧,不会排队。但实际上,我的意思更多的是您自己调用该方法而不是覆盖它(虽然我不清楚)。 - 现在,在某种非常简单的序列化库或其他东西上调用它实际上可能很有用;俗话说“永不言败” override def productPrefix = "\u2200",神圣的通心粉,这太酷了! 【参考方案1】:

元组(扩展Product)打印如下:

(x1, ..., xN)
^                  opening parenthesis
 ^                 elements
   ^               commas
            ^      closing parenthesis

案例类(也扩展Product)打印如下:

CaseClassName(x1, ..., xN)
^^^^^^^^^^^^^                    class name
             ^                   opening parenthesis
              ^                  elements
                ^                commas
                         ^       closing parenthesis

由于两者都继承自Product,因此可以在Product-trait 中提供一次默认的toString 实现,这会产生类似:

$productPrefix(x1, ..., xN)   // ascii-art, not actual code

productPrefix = "" 用于元组,productPrefix = "CaseClassName" 用于案例类。

鉴于Tuples 是该语言不可或缺的一部分,我可以想象,使用从Product trait 继承的方法实现可以在早期阶段达到“dogfooding”的实际目的。编译器开发:这实际上可能是traits 的第一个也是最简单的用途之一。 (这对我来说似乎有些合理,但这纯粹是推测性的;我并没有试图深入研究提交历史。)

否则,它没有更深层次的含义。它只是toString 实现的一部分。任何事情都不应依赖 toString 实现,也不应将其用于任何类型的程序逻辑。

【讨论】:

以上是关于Product.scala trait 中 productPrefix def 的实际使用的主要内容,如果未能解决你的问题,请参考以下文章

Trait讲解

scala中trait学习笔记

Spark基础-scala学习

Scala 学习之「trait 」

php中trait

PHP的Trait机制