Scala 当同伴对象在类中时使用.tuple方法
我正在从Slick迁移到Slick 2的过程中,在Slick 2中,当投影到case类时,您需要使用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
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是的,它是:。你确定你有案例课吗?