`
cloudtech
  • 浏览: 4605841 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

byName的高阶函数与普通参数的区别

 
阅读更多

本质的区别就是执行期不同,普通参数的表达式传参时已经开始执行,而byName的高阶函数在方式执行体中按定义顺序执行,有可能被短路。

def paramterMethod(b:Boolean){

if(false && b) println("hello")

}

paramterMetho(5 > 3)在传参时5 > 3一定已经运行,如果改成 1/0==0肯定抛出错误。


def funcMethod(b:=>Boolean){

if(false && b) println("hello")

}


paramterMetho(5 > 3)在传参时传的是一个返回Boolean的函数值,然后在if(false && b)时因为被适中,这个byName的函数并没被调用,所以5>3这个表达式

并没有作为参数传给那个byName的函数。


完整的例子:

object Main extends App {

def parameterMethod(b: Boolean) {
if (false && b) println("Hello!")
}

def funcMethod(b: => Boolean) {
if (false && b) println("Hello!")
}

funcMethod(1 / 0 == 0)
parameterMethod(1 / 0 == 0)
}

运行结果:

Exception in thread "main" java.lang.ArithmeticException: / by zero
at Main$delayedInit$body.apply(Main.scala:12)
at scala.Function0$class.apply$mcV$sp(Function0.scala:34)
at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
at scala.App$$anonfun$main$1.apply(App.scala:60)
at scala.App$$anonfun$main$1.apply(App.scala:60)
at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59)
at scala.collection.immutable.List.foreach(List.scala:76)
at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:30)
at scala.App$class.main(App.scala:60)
at Main$.main(Main.scala:1)
at Main.main(Main.scala)

第12行正是 parameterMethod(1 / 0 == 0)

分享到:
评论

相关推荐

    21高阶函数

    1.高阶函数 参数和返回值都是函数。 //传入参数是函数; val arr = Array(1,2,3,4) val fun = (x:Int) => x*2 val res = arr.map(fun) //传入匿名函数; val res2 = arr.map((x:Int) => x*2) val res3 = arr....

    函数调用约定与函数名称修饰规则

    函数调用约定与函数名称修饰规则-很实用 使用C/C++语言开发软件的程序员经常碰到这样的问题:有时候是程序编译没有问题,但是链接的时候总是报告函数不存在(经典的LNK 2001错误),有时候是程序编译和链接都没有...

    Python程序基础:函数综合案例.pptx

    所谓局部变量,指的是定义在函数内的变量,只能在函数内使用,它与函数外具有相同名称的其他变量没有任何关系。不同函数中,可以使用相同名字的局部变量,它们代表不同对象,互不干扰。此外,函数的形式参数也属于...

    istool:具有高阶函数的函数式 Javascript 库

    istool.js - 高阶函数 npm install istool 用法 var is = require ( 'istool' ) API 参考 is.eq 平等的 var arr = [ 'daewon' , 'dun' ] . filter ( is . eq ( 'daewon' ) ) ; // ['daewon'] is.ne 不相等 var ...

    Python中函数及默认参数的定义与调用操作实例分析

    本文实例讲述了Python中函数及默认参数的定义与调用操作。分享给大家供大家参考,具体如下: #coding=utf8 ''''' Python中的函数使用小括号调用。函数在调用之前必须先定义。 如果函数中没有return语句,就会自动...

    常用VBA函数精选

    第1.27例 LTrim、RTrim与 Trim 函数 第1.28例 Mid 函数 第1.29例 Month 和 MonthName函数 第1.30例 MsgBox 函数 第1.31例 Now函数 第1.32例 RGB函数 第1.33例 Rnd函数 第1.34例 Round函数 第1.35例 Split 函数 第1....

    kuka高级函数及其作用.docx

    获取与轴相关的控制器系统参数值: GET_SYSTEM_DATA(CHAR OWNER_NAME[16] :IN,CHAR OWNER_AXNAME[5] :IN,CHAR VAR_NAME[64] :IN,INT STATUS :OUT) 24.清除与$ERR相关的过程故障信息: ERR_CLEAR (ERROR_T PERR :...

    在ES5与ES6环境下处理函数默认参数的实现方法

    函数默认值是一个很提高鲁棒性的东西(就是让程序更健壮) MDN关于函数默认参数的描述:函数默认参数允许在没有值或undefined被传入时使用默认...我们将函数的两个参数name与age进行默认值的处理,如果没有则使用默认

    python函数的定义方式.docx

    它的定义方式如下: ``` def function_name(): # 函数体 ``` 其中,function_name是函数的名称,函数体是函数的具体实现。例如,下面是一个简单的无参数函数: ``` def say_hello(): print("Hello, world!") ``` ...

    Matlab高阶谱分析(HOSA)工具箱及安装方法

    You can improve the performance of your code by using exact name matches and we therefore recommend that you update your usage accordingly. Alternatively, you can disable this warning using warning('...

    函数调用约定与函数名称修饰规则.pdf

    这种协议规定了该语言的函数中的参数传送方式、参数是否可变和由谁来处理堆栈等问题。不同的语言定义了不同的调用约定。 在C++中,为了允许操作符重载和函数重载,C++编译器往往按照某种规则改写每一个入口点的符号...

    oracle service_name参数

    oracle service_name参数

    微信小程序云开发 调用云函数,云函数接收参数并返回

    一.调用云函数  ...2.data 传给云函数的参数  3.success(){}, 成功回调  4.fail(){}, 失败回调 wx.cloud.callFunction({ name: openId, data:{ a:'1' } success(res) { console.log('33333333

    C#函数手册 c#函数整理,主要包括数学函数

    c#函数整理,主要包括数学函数 Int(number) 传回小于或等于接收参数的最大整数值。 IsArray(varname) 判断一个变量是否为数组型态,若为数组则传回True,反之则为False。 IsDate(expression) 判断表达式内容是否为...

    定义基类person,数据成员name,sex,age,构造函数,析构函数,输出name,sex,age的函数display()。②定义公有派生类student

    定义基类person,数据成员name,sex,age,构造函数,析构函数,输出name,sex,age的函数display()。②定义公有派生类student,数据成员:num,构造函数,析构函数,输出name,sex,age,num的函数display()。③ ...

    Python如何在main中调用函数内的函数方式

    一般在Python中在函数中定义的函数是不能直接调用的,但是如果要用的话怎么办呢? 一般情况下: def a():#第一层函数 def b():#第二层函数 print('打开文件B') b()#第二层中的函数直接调用 结果显示: Traceback...

    十一、python基础:函数各种参数的用法

    十一、python基础:函数各种参数的用法 1、为什么函数要有参数? 我们封装成一个函数的目的就是为了让它可以重复使用,如果想要让函数能适应...这上面的get_info函数总共有三个参数:name, age, height。 它们是不是位

    python函数参数(必须参数、可变参数、关键字参数)

    必要参数,即函数调用时必须要传的参数, #下面进行举例说明 def helloWorld(a): print('输出:hello') if __name__ == '__main__': helloWorld("aaa") ## 必须要有参数 ##------------ 默认参数 -------------...

    测量程序编制 - python 85函数-参数(默认参数).pptx

    函数——默认参数#带默认值函数def printinfo( name, age = 35 ): "打印任何传入的字符串" print ("名字: ", name) print ("年龄: ", age) returnPython普通参数1Python普通参数2看下面代码结果:函数——默认参数#...

Global site tag (gtag.js) - Google Analytics