Scala方法与函数(四)
scala中有方法和函数,两则有一些区别。方法与Java中的方法类似,方法是组成类的一部分。函数则是一个完整的对象,scala 中的函数其实就是继承了 Trait 的类的对象,scala 中使用 val 语句可以定义函数,def 语句定义方法.
class Test{ //定义了一个方法,方法是使用def定义 def m(x: Int) = x + 3 //定义了一个函数,函数使用val定义 val f = (x: Int) => x + 3 }
一、方法的声明、定义
方法的声明格式如下:
def functionName ([参数列表]) : [return type]
注:如果不写等于号和方法主体,那么方法会被隐式声明为抽象(abstract),包含它的类型于是也是一个抽象类型。
scala 方法定义格式如下:
def functionName ([参数列表]) : [return type] = {
function body
return [expr]
}
方法定义由一个 def 关键字开始,紧接着是可选的参数列表,一个冒号 : 和方法的返回类型,一个等于号 = ,最后是方法的主体。return type 可以是任意合法的 Scala 数据类型。参数列表中的参数可以使用逗号分隔。
方法的调用: 方法名(参数列表)
案例如下:
如果方法没有返回值,可以返回为 Unit或者直接不写返回值,这个类似于Java 的 void
注意:返回值为Unit或者没写返回值,在方法体内部使用了return进行返回数据,此时也是无效的,返回结果均为()。
看下下面例子:
(n1+n2)计算结果为Int,返回值类型为Float或者Double,会自动进行类型转换
(n1+n2)计算结果为Int,返回值类型为Byte,Char等,编译不会通过
再看下图:
方法无参数时,可以省略(),直接使用方法名进行调用,注意m2和m3方法的调用,m2可以使用m2或者m2()进行调用,m3只能使用m3方法名调用,m3()编译会出错。
二、方法与函数的区别
例子:
scala> def m1(x:Int) = x+3 m1: (x: Int)Int scala> val f1 = (x: Int) => x+3 f1: Int => Int = <function1>
方法是一个以def开头的带有参数列表(可以无参数列表)的一个逻辑操作块,这正如object或者class中的成员方法一样。
函数是一个赋值给一个变量(或者常量)的匿名方法(带或者不带参数列表),并且通过=>转换符号跟上逻辑代码块的一个表达式。=>转换符号后面的逻辑代码块的写法与method的body部分相同
1.方法可以转化为函数,使用 方法名 _
看下下面输出结果:
直接打印方法m,报错,说明方法必须携带参数进行调用,或者可以改写下输出,println(m _),println(m(_)),参考下图,图中m _ 和 m(_)实则将方法转化为函数对象
方法转函数:
2、函数可作为一个参数传入到方法中,而方法不行
本文参考菜鸟教程-scala
教程中写到 "函数必须有参数列表 ",这个案例我试了下,发现并没有问题,我的scala版本是 2.13.3
不知道是不是scala版本的原因,因为菜鸟上的案例是2年前写的
暂时记录这里...