web-dev-qa-db-ja.com

コンパニオンオブジェクトがクラスにある場合の.tupledメソッドの使用

私はSlickからSlick 2に移行中です。Slick2では、ケースクラスに投影するときに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メソッドは、case classではなくtupledobjectを実行しようとしているため、機能しなくなりました。

Personではなくobjectcase classを取得する方法はあるので、tupledを正しく呼び出すことができますか?

41
mdedetrich

あなたも書くことができます

(Person.apply _).tupled

タイプの繰り返しを避けるため。

83
Alexey Romanov

これはAlexey Romanovが言ったことに非常に似ていますが、applyが必要なときにtupledを持ち上げないようにするために、コンパニオンオブジェクトに追加するだけです。

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

これで、コンパニオンオブジェクトがない場合と同じようにPerson.tupledを呼び出すことができます。

24
Tim Gautier

1つの回避策は、次のようにコンパニオンオブジェクトを定義することです。

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

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

6
kawty

Tupleがケースクラスに対して生成されたデフォルトのapplyメソッドを呼び出しているので、他のコメントのいくつかに基づいて次のことも実行できます。

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