40. 科理化Currying

科理化是把一个多参数的函数变成多个单参数的函数。

fun log(tag: String, target: OutputStream, message: Any?) {
    target.write("[$tag] $message\n".toByteArray())
}

fun log(tag: String)
        = fun(target: OutputStream)
        = fun(message: Any?)
                = target.write("[$tag] $message\n".toByteArray())

每个函数都是一个参数,看起来好清晰哦。上面两个函数真的一样吗?我们调用运行一下看看。

    log("Joel", System.out, "访问了首页。")
    log("Smith")(System.out)("访问了次页。")

运行的结果是

[Joel] 访问了首页。
[Smith] 访问了次页。

果然是一样的。
那么如果有返回参数怎么办呢?其实很简单的
例如

fun sing(who: String, shijian: String, where: String): String {
    return "$shijian ${who} 在 $where"
}

fun sing(who: String)
        = fun(shijian: String)
        = fun(where: String)
                = "$shijian ${who} 在 $where"

只要在最后一个等号写出你要返回的这个参数就好了。
调用如下

    println(sing("月亮", "晚上", "天上"))
    println(sing("太阳")("白天")("追月亮"))

运行结果是

晚上 月亮 在 天上
白天 太阳 在 追月亮
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容