图示,这是一个普通函数的定义(在java里面通常称为方法),函数可以定义在object单例对象中
1 object MyModule { //声明一个单例对象 —> 即同时声明一个类和它的唯一实例 2 def abs(n: Int): Int = //abs方法接收一个integer并返回一个integer 3 if (n < 0) -n //如果n小于0,返回-n 4 else n //否则返回n 5 6 private def formatAbs(x: Int) = { //一个私有方法只能被MyModule里的其他成员调用 7 val msg = "The absolute value of %d is %d" //字符串里有2个占位符,%d代表数字 8 msg.format(x,abs(x)) //在字符串里将2个%d占位符分别替换为x和abs(x) 9 } 10 11 def main(args: Array[String]): Unit = { //Unit类似于Java或C语言里的void 12 println(formatAbs(-42)) 13 } 14 }
一些基础概念:
通过def去定义一个函数,等号“=”左边的声明部分我们称为“函数签名”,右边则为“定义”
val定义的变量的是一个值相当于java中的final,不可变
Unit相当于类型空,当一个函数的返回值为空时,字面上会返回 "()"
通常返回Unit类型的函数,暗示它包含副作用
模块、对象和命名空间:
Scala总每个值都可以当成一个对象,每个对象都有零个或多个成员
对象的主要目的是给成员一个命名空间,也称模块
区别于JAVA,Int在Scala中也被视为对象 --->
1+2 可以看成1.+(2)的语法糖(只有对象才可以通过"."来调用成员)
高阶函数:
把一个函数当作参数传递给另一个函数被称为高阶函数
函数是一等公民,函数也是值
注:对于高阶函数的参数,我们通过以f、g来命名是一种习惯做法。在
函数式编程中,我们更倾向于使用短的变量名,甚至单个字母命名。因为高阶函数通常没
法表示参数到底执行什么,无法体现它们的含义(变量名的约定)
默认参数:
1 object HelloWorld { 2 def main(args: Array[String]): Unit = { 3 default() //默认参数:调用时没有手动传参,函数参数列表默认使用初始值 4 default("You") 5 } 6 7 def default(name: String = "My"): Unit = { //这里给予参数列表一个初始值 8 println("hello "+name) 9 } 10 }