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年前写的

暂时记录这里...

 

 

 

 

 

 

 

 

 

posted @ 2020-10-21 14:43  楔子  阅读(173)  评论(0)    收藏  举报