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

时间:2014-03-13 01:00:07

标签: scala singleton slick case-class

我正在从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方法不再有效,因为它尝试在tupled而不是object上运行case class

有没有办法检索case class Person而非object,以便您可以正确调用tupled

4 个答案:

答案 0 :(得分:78)

你也可以写

(Person.apply _).tupled

避免重复这些类型。

答案 1 :(得分:20)

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

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

现在,您可以像Person.tupled一样调用 XElement xmlTree = new XElement("Root", new XElement[] { new XElement("Child1", 1), new XElement("Child2", 2), new XElement("Child3", 3), new XElement("Child4", 4), new XElement("Child5", 5) });​ ,如果它没有配套对象的话。

答案 2 :(得分:5)

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

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

请参阅。 https://groups.google.com/d/msg/scala-user/jyWBMz5Qslw/Bryv4ftzRLgJ

答案 3 :(得分:3)

要构建其他一些注释,您可以执行以下操作,因为元组正在为案例类调用生成的默认应用方法。

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