通过上面案例我们发现Scala并不是纯的函数语言,Scala号称是面向对象和函数语言的混合,那么Scala是纯的面向对象吗?
IS SCALA PURE OBJECT-ORIENTED PROGRAMMING LANGUAGE??一文回答了这个问题。
Scala是纯的面向对象,其函数和初始类型在Scala中也都是对象。
函数是对象
内部函数只是一个带有apply方法的trait,如下是一个名为Function1的 trait接口,其有一个apply函数(方法) :
trait Function1[A,B]{
def apply(x:A):B
}
上面这个trait接口表示它将类型A作为参数,返回类型 B,所以它是一种关于类型 Int => Int = <function1>的函数。
如果按照下面编写一个匿名函数:
val f=(x:Int)=>x*x
在Scala内部,它实际是:
val f=new Function1[Int,Int]{
def apply(x:Int)=x*x
}
当我们调用这个函数时内部其实是调用trait的apply函数方法,比如我们如此调用:
f(4)
内部它调用trait的apply函数方法,实际是如下对象方式的调用:
f.apply(4)
初始类型也是对象
内部所有原始类型都是带有操作方法的类,看看下面代码:Boolean 类型
abstract class Boolean{
def ifThenElse[T](t: =>T,e: =>T):T
def &&(x: =>Boolean):Boolean=ifThenElse(x,false)
}
内部的true 或 false其实是一个对象,覆盖了原来的方法行为。
object true extends Boolean
{
def ifThenElse[T](t: =>T,e: =>T)=t
}
object false extends Boolean
{
def ifThenElse[T](t: =>T,e: =>T)=e
}
在Scala中,每个初始类型都是一个对象,操作符是函数方法,这样,当我们编写数学公式如 3+3 时,其内部面向对象翻译为:3.+(3)
这里的“3”代表一个对象,而“+”是对象类内部的函数方法而已。
Int类的定义如下:
class Int{
def +(that:Int):Int
def -(that:Int):Int
def /(that:Int:Int
def *(that:Int):Int
def
}
<p class="indent">
|
[该贴被banq于2015-03-31 09:27修改过]