【值传递和引用传递之外的第三种传值方式 - 传名参数】

引言

先看下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)
    }
}
  • 区别
    1. 参数类型不同, 前者是函数, 后者传递的是 Boolean
    2. 调用时机不同, 前者在真正运行test方法是,才会调用isTrue的方法体,后者是先计算出 isTrue 的值 (此处为 true) 后调用test 方法

有待探索

此处 把 () 省略了,那么含有参数的函数能否通过该方式实现吗?😕

参考内容


  1. 实验楼 - 函数(二) - 传名参数 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值