次のコードが与えられます:
case class Config(
addThree: Boolean = true,
halve: Boolean = true,
timesFive: Boolean = true
)
def doOps(num: Integer, config: Config): Integer = {
var result: Integer = num
if ( config.addThree ) {
result += 3
}
if ( config.halve ) {
result /= 2
}
if ( config.timesFive ) {
result *= 5
}
result
}
val config = Config(true,false,true)
println( doOps(20, config) )
println( doOps(10, config) )
醜いdoOpsメソッドをより効率的で慣用的な構成に置き換えたいと思います。具体的には、使用されている特定の構成に基づいて、必要な変換のみを実行する関数のチェーンを構築したいと思います。整数を渡すことができる、ある種の部分的に適用された関数を作成したいと思うかもしれませんが、これを効率的に実現する方法については空白を描いています。
特に、doOps内のifステートメントを避けたいので、結果の構造体を、最初に条件をチェックせずにチェーン内の次の関数を呼び出す関数のチェーンにします。
結果のコードは、次のようになると思います。
case class Config(
addThree: Boolean = true,
halve: Boolean = true,
timesFive: Boolean = true
)
def buildDoOps(config: Config) = ???
val config = Config(true,false,true)
def doOps1 = buildDoOps(config)
println( doOps1(20) )
println( doOps1(10) )