定义
方法和函数是作为两种东西在scala中存在的,在大多数时候他们差不太多,但是时不时的可能会有一些问题体现出他们各自不一样的情况。
函数类型:形式为(T1,…, Tn) => U,其实是FunctionN trait的简写形式,匿名函数和方法值具有这种类型(其实可以作为方法类型的一部分)
方法类型:一个非值类型(non-value type),里边是没有值的,一个方法值具有函数类型,用def定义。
方法
方法在scala中和java中一样,是一个类的一个部分
函数
函数在scala中是一个完整的对象,是一系列trait(FunctionN)的实现,由于scala “apply”的特殊语法,也就是说obj.apply()可以用obj()的方式进行调用,所以函数可以直接用后跟括号的方式进行调用
区别的一部分细节
1.方法不能作为单独的存在,除非参数为空,函数可以
def m(x: Int) = 2 * x
这是一个方法,因为不能单独存在,所以不能直接调用
val f = (x: Int) => 2 * x
这是一个函数,就可以单独进行调用,因为f其实是一个trait的实现(FunctionN),相当于f.apply()
2.方法可以没有参数列表,函数必须有,也就是参数列表方法可省略,函数不可省略
def m1 = 100
def m2() = 100
//这两个都是方法,接受参数都是0个,第一种省略了参数列表,第二个没有
val f1 = () => 100
//val f2 = =>100 没有这种写法
3.函数名后必须加括号才代表函数调用,否则为该函数本身,而方法名后不加括号为方法调用
4.方法可以进行eta展开,即自动转换为函数
5.方法不是值,函数是值,所以方法不能绑定给一个val变量,函数可以
6.方法有重载情况时,如果自动将方法转换为函数,需要指定参数和返回值类型
7.方法可以使用参数序列,转换称函数使用Seq对象
8.方法支持默认参数值,函数不能省略参数,不支持