Scala 当同伴对象在类中时使用.tuple方法

Scala 当同伴对象在类中时使用.tuple方法,scala,singleton,slick,case-class,Scala,Singleton,Slick,Case Class,我正在从Slick迁移到Slick 2的过程中,在Slick 2中,当投影到case类时,您需要使用tuple方法(如图所示) 问题是当case类有一个伴生对象时,也就是说,如果您有这样的对象 case class Person(firstName:String, lastName:String) { } 连同一个伴星 object Person { def something = "rawr" } 在同一范围内,tupled方法不再有效,因为它试图在对象上运行tu

我正在从Slick迁移到Slick 2的过程中,在Slick 2中,当投影到case类时,您需要使用
tuple
方法(如图所示)

问题是当case类有一个伴生对象时,也就是说,如果您有这样的对象

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

}
连同一个伴星

object Person {
  def something = "rawr"
}
在同一范围内,
tupled
方法不再有效,因为它试图在
对象上运行
tupled
,而不是在
案例类上运行


有没有一种方法可以检索
Person
案例类
,而不是
对象
,这样您就可以正确调用
tuple

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

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

你也可以写

(Person.apply _).tupled

为了避免重复这些类型。

这与Alexey Romanov所说的非常相似,但为了避免在需要
元组时提升
应用
,我们只需将其添加到我们的同伴对象中

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

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

要在其他一些注释的基础上进行构建,您还可以执行以下操作,因为tuple正在调用为case类生成的默认apply方法

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

你真的需要伴星吗?另外,我认为这是一个与Slick无关的一般Scala问题。是的,我是这样做的,除非我想重构我项目的一半(伴生对象有很多用于讨论中的case类的帮助方法),是的,你是对的,它与Slick没有直接关系,刚才提到它是因为Slick可能有自己的解决方法您不能只重命名伴随对象并将重命名对象的内容直接导入case类?或者,您也可以手动使自定义的伴生对象看起来像自动生成的对象。是的,但按照习惯说法,如果您有处理
Person
的全局函数,它们应该在
Person
命名空间上工作,这就是单例模式的全部目的。当使用带有
BigDecimal
的全局方法时(例如),这些方法附加到
BigDecimal
,而不是
BigDecimalHelpers
或类似的东西,其实它们并没有消失,看看这个答案。至于为什么tupled方法“消失”,我不知道。快速阅读之后,可能要看隐式如何将其引入范围(这是在内部完成的)。请记住,您仍然可以使用
case类
fine,即使有一个配套的
对象
。这个问题之所以出现,是因为我特别需要使用tupled方法谢谢,它实际上是有效的(我假设样板没有任何解决方法,即(String,String)),如果伴生对象有自己的apply方法(重载构造函数),该怎么办?编译器无法解析应用程序…找到答案:这不是编译:
apply
notfound@javadba是的,它是:。你确定你有案例课吗?