需求
模拟实现while循环。
分析
- while的语法格式为:while(条件表达式) {循环体}
- Scala中大括号和小括号可以互相转化:while(条件表达式)(循环体)
- 一个函数两个参数列表,就是柯里化的形式,循环体就要把代码块传递过来,循环就要使用递归。需要注意的是,条件表达式也要以代码块的形式传递过来。因为自定义的函数只会执行一次,如果传递的是表达式的值,后面递归过程中,条件表达式的值都是和初始一样的。
柯里化方式实现
// 模拟实现while循环
// 循环条件也要传代码块,因为myWhile函数只会在主函数调用一次,条件不会变
def myWhile(b: => Boolean)(body: => Unit): Unit = {
if (b) {
body
myWhile(b)(body)
}
}
var a = 10
myWhile(a > 0) {
println(a)
a -= 1
}
普通方式实现
def myWhile2(b: => Boolean, body: => Unit): Unit = {
if (b) {
body
myWhile2(b, body)
}
}
var a = 10
myWhile2(a > 0, {
println(a)
a -= 1
})
闭包方式实现
def myWhile3(b: => Boolean): (=> Unit) => Unit = {
def fun(body: => Unit): Unit ={
if (b){
body
myWhile(b)(body)
}
}
fun _
}
//调用
var a = 10
myWhile3(a > 0){
println(a)
a -= 1
}