Нет, функция не обязательна для сериализации ... и сериализуемые функции вряд ли обеспечат удобочитаемую сериализацию.
Если вы хотите иметь возможность выполнять какие-либо функции, я боюсь, что не будет никакого решения. Возможный обходной путь, если его можно использовать в вашем сценарии, - это создать класс case, который реализует Function[Int, Boolean]
, и, таким образом, вернуться к сценарию класса case.
Например, предположим, что вы изолировали, что все ваши функции проверяют, является ли целое число делимым точно на данное целое число:
case class Mod(mod: Int) extends Function[Int, Boolean] { //the extends part is not even require
def apply(x: Int) = x % mod == 0
}
case class Foo(bar: Mod, baz: Int)
Это явно ультра-ограничительный. Но я боюсь, что это лучшее, что ты можешь достичь.
Согласно вашему редактированию. Решением может быть фабричный класс:
case class IntTest(humanReadableDescription: String) {
def apply(x: Int) = IntTest.fromString(humanReadableDescription)(x)
}
object IntTest {
private val fromString = Map[String, Function[Int, Boolean]] (
"mod2" -> {x:Int => x % 2 == 0},
"is42" -> {x:Int => x == 42}
)
}
case class Foo(bar: IntTest, baz: Int)
Но здесь вы потеряете безопасность типов.