Scala中高阶方法未提前定义函数值的处理机制是怎样的?
Scala高阶函数运行原理解答
结论先行
你的两个判断完全正确:
- 调用
update方法时,只要传入**符合Int => Int类型签名(接收1个Int参数、返回Int结果)**的函数值,就可以正常运行 - 「调用高阶方法时传入符合参数/返回值类型要求的函数值即可正常运行」的思路完全成立
核心逻辑说明
Scala中高阶函数的设计本质就是只约束传入函数的类型签名,不约束具体实现逻辑:
- 你在定义高阶方法时写的
f: Int => Int、f:(Int,Int)=>Int都是函数类型声明,本质是约定了传入函数的「参数个数、参数类型、返回值类型」三个核心要素,只要调用时传入的函数满足这三个要素,不管具体实现是加减乘除还是自定义逻辑,都可以正常执行 - Scala中函数是一等公民,和Int、String等普通数据类型地位完全一致,你写的
i => i + 5、_+_都属于匿名函数字面量,本质是对应Function1[Int,Int]、Function2[Int,Int,Int]特质的实例,你可以当场创建当场传入方法,不需要提前给这个函数实例定义变量名,这和你调用接收String参数的方法时可以直接传"Hello"字面量,不需要提前定义val s = "Hello"再传s的逻辑完全一致。
补充验证示例
你可以自行测试不同的合法传参,都可以正常运行:
// 给update传求平方的逻辑 b.update(i => i * i) b.printMsg("结果是") // 输出:结果是36(假设之前x已经变成6) // 给higher_order传乘法逻辑 higher_order(2,3,4,_*_) // 计算逻辑为(2*3)*4,返回24 // 给higher_order传取最大值的逻辑 higher_order(5,2,7,Math.max) // 计算逻辑为max(max(5,2),7),返回7
内容的提问来源于stack exchange,提问作者Aviral Srivastava
相关产品推荐
相关产品推荐

