Конструктор класса Curried case на компаньоне
При определении класса case объект-компаньон по умолчанию имеет хороший метод curried
для получения карри-версии конструктора класса case:
scala> case class Foo(a: String, b: Int)
defined class Foo
scala> Foo.curried
res4: String => (Int => Foo) = <function1>
Однако, как только я определяю явный объект-компаньон, этот метод исчезает:
scala> :paste
// Entering paste mode (ctrl-D to finish)
case class Foo(a: String, b: Int)
object Foo {}
// Exiting paste mode, now interpreting.
defined class Foo
defined module Foo
scala> Foo.curried
<console>:9: error: value curried is not a member of object Foo
Foo.curried
Я могу вернуть его так:
scala> :paste
// Entering paste mode (ctrl-D to finish)
case class Foo(a: String, b: Int)
object Foo { def curried = (Foo.apply _).curried }
// Exiting paste mode, now interpreting.
defined class Foo
defined module Foo
scala> Foo.curried
res5: String => (Int => Foo) = <function1>
Однако я хотел бы знать, почему он исчезает при определении явного компаньона (например, в отличие от apply
)?
(Scala 2.9.2)
Ответы
Ответ 1
Scalac создает спутник по умолчанию для каждого case class
. Сопутствующий компаньон по умолчанию реализует scala.Function
n.
Когда вы определяете явный собеседник, Scalac объединит явный компаньон по умолчанию.
Если вы хотите вызвать curried
, вы должны позволить вашему явному компаньону реализовать Function2
. Попробуйте:
case class Foo(a: String, b: Int)
object Foo extends ((String, Int) => Foo) {
def otherMethod = "foo"
}