Scala中名词的解释
柯里化
- 解释
- 在计算机科学中,柯里化(Currying),又译为卡瑞化或加里化,是把接收多个参数的函数变换成接收一个单一参数(最初函数的第一个参数)的函数,并返回接受剩余的参数而且返回结果的新函数的技术
-
普通加和函数
//函数实现 function add(a,b){ return a+b; } //函数调用 add(1,2);
-
采用柯里化
//函数实现 var add=function(a){ return function(b){ return a+b; } } //函数调用 add(3)(5);
- 其实实质就是闭包的概念,柯里化所要表达的就是:如果你固定某些参数,你将得到接受剩余参数的一个函数;这就是求值策略中的部分求值策略。
闭包
- 闭包就是一个函数引用另一个函数的变量,因为变量被引用着所以不会被回收,因此可以用来封装一个私有变量。这是优点也是缺点,不必要的闭包只会徒增内存消耗!
- 看下面的函数例子
//函数实现 function lazy_sum(arr){ var sum=function(){ retrun arr.reduce(function(x,y){ return x+y; }); } return sum; } //调用函数 var f=lazy_sum([1,2,3,4,5]);
- 在上述的函数中,在lazy_sum函数中定义了sum函数,并且函数num可以引用外部函数lazy_sum的参数和局部变量,当lazy_sum函数返回函数sum时,相关参数和变量都保存在返回的函数中,这种成为“闭包”(Closure)的程序结构拥有极大的威力。
-
闭包应用的两种情况
-
函数作为返回值
-
例
//函数定义 function fn(){ var max=10; return function bar(x){ if(x>max){ console.log(x); } } } //函数使用 var f1=fn(); f1(15);
- 如上代码,bar函数作为返回值,赋值给f1变量。执行f1(15)时,用到了fn作用域下的max变量的值
-
-
函数作为参数传递
-
例
var max=10; fn=function(x){ if(x>max){ console.log(x); } } (function(f){ var max=100; f(15); })(fn);
- 如上代码,fn作为一个参数被传递进另一个函数,赋值给f参数,执行f(15)时,max变量的取值是10,而不是100
-
-
字面量
- 字面量(literal)是用于表达源代码中一个固定值表示法;
- 字面量是指由字母,数字等构成的字符串或者数值,它只能作为右值出现,(右值是指等号右边的值,如int a=123,这里的a为左值,123为右值)
- 例
int a=10; //10为int类型字面量
scala中的val,var,def
- val类似java中的final变量,一旦初始化了,就不能再赋值
- var,与val正好相反,可以在生命周期被多次赋值
- def定义一个方法
- 见到这样的代码别让它迷惑了【add其实就是函数,sum是函数的返回值】
var sum=12; def add=sum;
- 见到这样的代码别让它迷惑了【add其实就是函数,sum是函数的返回值】
Scala中的单例对象
- Scala单例对象是十分重要的,没有像在java一样,有静态类、静态成员、静态方法,但是Scala提供了objec对象,这个object对象类似于java的静态类,它的成员、它的方法默认都是静态的
Scala伴生对象
- 如果有同样一个类与object名字一样,则称该object为该类的伴生对象,相应的,该类为object的伴生类。如果一个类有它的伴生对象,这个类就可以通过object的名字访问到所有成员,但object不在该类的作用范围。