scala中内部函数的使用
来源:互联网 发布:g2553烧录软件 编辑:程序博客网 时间:2024/06/05 09:31
在函数式语言中,函数是一等公民,也是最基本的功能块。通常为了使代码更加清晰易读,我们往往会写许多辅助函数。但是大家都知道,给函数或者变量起个合适的名字,是coding中最难的任务,没有之一。函数多了以后,很容易名字就冲突,而且暴露给外部过多的函数也会带来各种问题。在java里,我们是通过private method这种方式来解决。当然,scala里也可以这么干。但是我们既然说scala是函数式语言,那我们就采用函数式语言的方式来解决这个问题:在函数内部再定义函数。就像局部变量一样,其作用 域仅限于外部函数内部。
在http://blog.csdn.net/bitcarmanlee/article/details/52194255一文中,我们提到了用牛顿法求解方根。现在我们以此为例,来看看scala中怎么实现。
1.常规方式,定义很多外部函数
object Demo { //满足终止条件 def isGoodEnough(guess:Double,x:Double) = abs(guess * guess - x) < 0.0001 //返回绝对值 def abs(x:Double) = if (x<0) -x else x //迭代公式 def sqrtIter(guess:Double,x:Double):Double = if (isGoodEnough(guess,x)) guess else sqrtIter((guess + x/guess)/2,x) //默认从1开始迭代 def sqrt(x:Double):Double = sqrtIter(1,x) def main(args: Array[String]): Unit = { println(sqrt(2)) }}
将代码run起来:
1.4142156862745097
上面的代码,总共定义了4个函数。但是对于用户来说,用户只关心sqrt函数,而我们一下暴露了4个函数给用户。scala 里可以内部函数,我们可以将这些辅助函数定义为 sqrt的内部函数,更进一步,由于内部函数可以访问其函数体外部定义的变量,我们可以去掉这些辅助函数中的 x参数,代码将会变得更为简洁,内部函数访问包含该函数的参数是非常常见的一种嵌套函数的用法。
2.使用内部函数
object Demo { def sqrtEncapsulation(x:Double):Double = { def sqrtIter(guess:Double):Double = { if(isGoodEnough(guess)) guess else sqrtIter((guess + x/guess) / 2) } def isGoodEnough(guess:Double) = { abs(guess * guess - x) < 0.0001 } def abs(x:Double) = { if(x < 0) -x else x } sqrtIter(1) } def main(args: Array[String]): Unit = { println(sqrtEncapsulation(2)) }}
是不是经过这么包装以后,代码的可读性更强,封装得也更好,使用起来也更为方便呢?
0 0
- scala中内部函数的使用
- scala基础23-内部函数
- Mysql 内部函数的使用
- Mysql 内部函数的使用
- Scala中Case的使用
- scala中yield的使用
- scala中function的使用
- Scala中方法和函数的区别
- scala 中方法和函数的区别
- Scala中方法和函数的区别
- C++ 中使用构造函数初始化列表和普通构造函数内部初始化的区别
- scala学习之Scala中类的使用
- 【scala】Scala中lazy关键字的使用和理解
- C++中虚函数的内部实现
- javascript中对象写在函数外面,函数内部不能使用
- Scala中偏函数
- Scala中json4s的使用例子
- Scala 中trait的使用(一)
- JQuery 现实 三级联动菜单
- SVM和SVR
- CODEVS 1039数的划分
- php 将print_r处理后的数据还原为原始数组的方法
- 编程珠玑
- scala中内部函数的使用
- python 虚拟环境virtualenv的安装和使用
- 小菜谈谈之缓冲区溢出
- LeetCode 56 Merge Intervals
- 面试之javaSe(二)
- 菜鸟重拾C语言之路(1)
- 【openjudge 1759】最长上升子序列(dp)
- 判断回文数
- Android逆向基础笔记—Android NDK开发2之Windows下的gcc手动编译(交叉连编译)和利Linux Ubuntu系统下的交叉工具链手动编译