引言
先看下Scala 的以下方法该如何调用那?
class Demo {
val assertIsOpen = true
def test(isTrue: () => Boolean): Unit =
if (assertIsOpen && !isTrue)
throw new Exception("Error!")
}
调用测试
-
错误调用一
new Demo().test(3 > 2)
错误原因: 方法参数为 空参切返回值为 Boolean 的函数, 改调用 传递的是 Boolean 类型,类型错误. 等价于
new Demo().test(true)
-
错误调用二
new Demo().test( => 3 > 2) new Demo().test( _ => 3 > 2)
错误原因: 学费了,Scala 虽然有些地方可以省略 或 简写,但是也没那么随便. 第二行, 完全错误,传的是 一个参数返回 为 Boolean 的函数
-
正确调
val func = () => 3 > 2 new Demo().test(func) new Demo().test( () => 3 > 2)
点定义 函数变量传递, 或省略变量直接传.
那么Scala 能不能 即省略 () 或 => , 又能实现传递函数的方法那,答案是肯定的.
传名参数
传名参数是区别于
值传递
和引用传递
的 第三种传递参数的方法.修改以上方法的定义,以=>
开始, 而不是() =>
开始 1, 实现如下
class Demo{
val assertionIsOpen = true
def test(isTrue : => Boolean) : Unit =
if (assertionIsOpen && !isTrue)
throw new Exception("Error!")
}
object Demo{
def main(args: Array[String]): Unit = {
new Demo().test( 3 > 2)
}
}
使用以上定义就可以 省略 () =>
了 🎉️ 🎉️ 🎉️
注意
一下方法虽然调用方式相同,但是实际意义是完全不同的.
class Demo{
val assertionIsOpen = true
def test(isTrue : Boolean) : Unit =
if (assertionIsOpen && !isTrue)
throw new Exception("Error!")
}
object Demo{
def main(args: Array[String]): Unit = {
new Demo().test( 3 > 2)
}
}
- 区别
- 参数类型不同, 前者是函数, 后者传递的是 Boolean
- 调用时机不同, 前者在真正运行test方法是,才会调用isTrue的方法体,后者是先计算出 isTrue 的值 (此处为 true) 后调用test 方法
有待探索
此处 把
()
省略了,那么含有参数的函数能否通过该方式实现吗?😕