【问题标题】:Using .tupled method when companion object is in class当伴生对象在类中时使用 .tupled 方法
【发布时间】: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 或类似的东西
  • 其实他们并没有消失,看看这个答案stackoverflow.com/a/22368413/1519631。至于为什么tupled 方法“消失”,我不知道。在快速阅读之后,可能取决于它是如何被隐式带入作用域的(这是在内部完成的)。请记住,即使有同伴object,您仍然可以使用case classes。这个问题只是因为我特别需要使用元组方法而出现

标签: scala singleton slick case-class


【解决方案1】:

你也可以写

(Person.apply _).tupled

避免重复类型。

【讨论】:

【解决方案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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多