Итак, я использую шаблоны play Twirl (не в игре; независимый проект), и у меня есть несколько шаблонов, которые генерируют некоторые DDL базы данных. Следующие работы:
if(config.params.showDDL.isSupplied) {
print( BigSenseServer.config.options("dbms") match {
case "mysql" => txt.mysql(
BigSenseServer.config.options("dbDatabase"),
InetAddress.getLocalHost().getCanonicalHostName,
BigSenseServer.config.options("dboUser"),
BigSenseServer.config.options("dboPass"),
BigSenseServer.config.options("dbUser"),
BigSenseServer.config.options("dbPass")
)
case "pgsql" => txt.pgsql(
BigSenseServer.config.options("dbDatabase"),
InetAddress.getLocalHost().getCanonicalHostName,
BigSenseServer.config.options("dboUser"),
BigSenseServer.config.options("dboPass"),
BigSenseServer.config.options("dbUser"),
BigSenseServer.config.options("dbPass")
)
case "mssql" => txt.mssql$.MODULE$(
BigSenseServer.config.options("dbDatabase"),
InetAddress.getLocalHost().getCanonicalHostName,
BigSenseServer.config.options("dboUser"),
BigSenseServer.config.options("dboPass"),
BigSenseServer.config.options("dbUser"),
BigSenseServer.config.options("dbPass")
)
})
System.exit(0)
}
Но у меня много повторяющихся заявлений. Если я попытаюсь присвоить регистр переменной и использовать трюк $.MODULE$, я получу сообщение об ошибке, говорящее, что моя переменная не принимает параметры:
val b = BigSenseServer.config.options("dbms") match {
case "mysql" => txt.mysql$.MODULE$
case "pgsql" => txt.pgsql$.MODULE$
case "mssql" => txt.mssql$.MODULE$
}
b("string1","string2","string3","string4","string5","string6")
и ошибка:
BigSense/src/main/scala/io/bigsense/server/BigSenseServer.scala:32: play.twirl.api.BaseScalaTemplate[T,F] с play.twirl.api.Template6[A,B,C,D,E ,F,Result] не принимает параметров
Как лучше всего упростить этот код Scala?
EDIT: Окончательное решение, используя комбинацию ответов ниже
В приведенных ниже ответах предлагается создать фабричные классы, но я действительно хочу этого избежать, поскольку у меня уже есть сгенерированный Twirl объект шаблона. Частично примененные функции помогли мне лучше понять, как этого добиться. Оказывается, все, что мне нужно было сделать, это выбрать apply
методов и выполнить их эта-расширение; при необходимости в сочетании с частичным применением функций. Отлично работает следующее:
if(config.params.showDDL.isSupplied) {
print((config.options("dbms") match {
case "pgsql" =>
txt.pgsql.apply _
case "mssql" =>
txt.mssql.apply _
case "mysql" =>
txt.mysql.apply(InetAddress.getLocalHost().getCanonicalHostName,
_:String, _:String, _:String,_:String, _:String)
})(
config.options("dbDatabase"),
config.options("dboUser"),
config.options("dboPass"),
config.options("dbUser"),
config.options("dbPass")
))
System.exit(0)
}