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"
用于案例类。
鉴于Tuple
s 是该语言不可或缺的一部分,我可以想象,使用从Product
trait 继承的方法实现可以在早期阶段达到“dogfooding”的实际目的。编译器开发:这实际上可能是trait
s 的第一个也是最简单的用途之一。 (这对我来说似乎有些合理,但这纯粹是推测性的;我并没有试图深入研究提交历史。)
否则,它没有更深层次的含义。它只是toString
实现的一部分。任何事情都不应依赖 toString
实现,也不应将其用于任何类型的程序逻辑。
【讨论】:
以上是关于Product.scala trait 中 productPrefix def 的实际使用的主要内容,如果未能解决你的问题,请参考以下文章