当伴生对象在类中时使用 .tupled 方法

Posted

技术标签:

【中文标题】当伴生对象在类中时使用 .tupled 方法【英文标题】:Using .tupled method when companion object is in class 【发布时间】:2014-04-17 12:09:37 【问题描述】:

我正在从 Slick 迁移到 Slick 2,在 Slick 2 中,您应该在投影到案例类时使用 tupled 方法(如此处所示 http://slick.typesafe.com/doc/2.0.0-RC1/migration.html

问题是当案例类有一个伴生对象时,即如果你有这样的东西

case class Person(firstName:String, lastName:String) 


伴随对象

object Person 
  def something = "rawr"

在同一范围内,tupled 方法不再起作用,因为它试图在 object 上运行 tupled,而不是 case class

有没有办法检索Personcase class 而不是object,这样就可以正确调用tupled

【问题讨论】:

你绝对需要伴生对象吗?另外,我认为这是一个与 Slick 无关的一般 Scala 问题。 是的,除非我想像我的项目的一半那样重构(伴生对象有很多用于相关案例类的辅助方法),是的,你是对的,它与slick,刚刚提到它是因为 Slick 可能有自己的解决方法 不能只重命名伴生对象,然后将重命名对象的内容直接导入案例类吗?或者,您可以手动使您的自定义伴随对象看起来像一个自动生成的对象。 是的,但习惯上来说,如果你有处理Person的全局函数,它们应该在Person命名空间上工作,这就是单例模式的全部目的。带有BigDecimal 的全局方法(例如),这些方法附加到BigDecimal,而不是BigDecimalHelpers 或类似的东西 其实他们并没有消失,看看这个答案***.com/a/22368413/1519631。至于为什么tupled 方法“消失”,我不知道。在快速阅读之后,可能取决于它是如何被隐式带入作用域的(这是在内部完成的)。请记住,即使有同伴object,您仍然可以使用case classes。这个问题只是因为我特别需要使用元组方法而出现 【参考方案1】:

你也可以写

(Person.apply _).tupled

避免重复类型。

【讨论】:

如果伴生对象有自己的 apply 方法(重载的构造函数)怎么办?编译器无法解析应用... 找到答案:***.com/questions/41179532/… 这不是编译:apply not found @javadba 是的,它是:scalafiddle.io/sf/a5rsgke/0。你确定你有案例课吗?【参考方案2】:

这与 Alexey Romanov 所说的非常相似,但为了避免在您需要 tupled 时提升 apply,我们只需将其添加到我们的伴随对象中。

object Person 
  def something = "rawr"
  def tupled = (Person.apply _).tupled

现在您可以调用Person.tupled,就像它没有伴随对象时一样。

【讨论】:

【参考方案3】:

一种解决方法是定义一个伴随对象,如下所示:

object Person extends((String,String) => Person) 
    ...

看。 https://groups.google.com/d/msg/scala-user/jyWBMz5Qslw/Bryv4ftzRLgJ

【讨论】:

谢谢,这确实有效(我认为样板文件没有任何解决方法,即 (String,String) )【参考方案4】:

要在其他一些 cmets 的基础上进行构建,您也可以执行以下操作,因为 tuple 正在为案例类调用生成的默认应用方法。

object Person 
  ...
  def tupled = (this.apply _).tupled

【讨论】:

以上是关于当伴生对象在类中时使用 .tupled 方法的主要内容,如果未能解决你的问题,请参考以下文章

Scala编程之伴生对象

面向对象:对象

深入kotlin- 伴生对象和扩展

scala伴生类和伴生对象的理解

快学Scala 第九课 (伴生对象和枚举)

深入kotlin- 伴生对象和扩展