如何扩展函数类型以支持更多可忽略参数?
扩展函数以接收可忽略参数的实现方案
给定函数
f: Function[A,B],是否存在通用方式生成类型为Function2[A, C, B]且忽略第二个参数的函数?更通用地说,能否将任意函数类型扩展为接收任意数量可忽略参数的函数?
单个扩展场景(从Function1到Function2)
直接写个包装函数就能搞定,以Scala为例:
def ignoreSecond[A, B, C](f: A => B): (A, C) => B = (a, _) => f(a)
用的时候把原函数传进去,就得到了忽略第二个参数的Function2:
val original: Int => String = _.toString val extended: (Int, Boolean) => String = ignoreSecond(original) extended(123, true) // 返回"123"
通用扩展场景(支持任意数量可忽略参数)
要实现任意数量的可忽略参数,可以借助Scala的隐式扩展特性,给不同参数数量的函数定义扩展方法:
// 给Function1扩展支持忽略额外参数的方法 implicit class Function1Extensions[A, B](private val f: A => B) extends AnyVal { def ignoreArg[C]: (A, C) => B = (a, _) => f(a) def ignoreArgs[C, D]: (A, C, D) => B = (a, _, _) => f(a) // 按需继续添加更多参数的版本 } // 给Function2扩展类似的方法 implicit class Function2Extensions[A1, A2, B](private val f: (A1, A2) => B) extends AnyVal { def ignoreArg[C]: (A1, A2, C) => B = (a1, a2, _) => f(a1, a2) def ignoreArgs[C, D]: (A1, A2, C, D) => B = (a1, a2, _, _) => f(a1, a2) }
使用示例:
val strLen: String => Int = _.length // 扩展为多接收一个可忽略参数的函数 val lenWithIgnore: (String, Double) => Int = strLen.ignoreArg // 扩展为多接收两个可忽略参数的函数 val lenWithTwoIgnores: (String, Boolean, Long) => Int = strLen.ignoreArgs lenWithIgnore("hello", 3.14) // 返回5 lenWithTwoIgnores("world", true, 100L) // 返回5
这种方式可以覆盖任意原函数类型,只要给对应的FunctionN定义好扩展方法,就能轻松生成带任意数量可忽略参数的新函数。
内容的提问来源于stack exchange,提问作者gogstad
相关产品推荐
相关产品推荐

