yuxuanchiadm
本帖最后由 yuxuanchiadm 于 2019-7-19 20:14 编辑

【索引贴】https://www.mcbbs.net/thread-887515-1-1.html

前言

可以跟着教程自己在Scala REPL尝试运行相关代码。在Scala中的能通过声明Declaration语句将一个标识符Identifier跟一个类型Type绑定起来,以供后续使用,声明语句包含以下几种:
本节将介绍前三种,以及其对应的定义Definition语句。

值和类型

概括的来说,使用Scala编程就是编写程序并对各种类型的值进行计算的过程。举例来说,字符串、数字、布尔值等就是在编程中常用的值,还有一些值是通过把其他的值组合起来组成新的值,例如数组、列表就是典型的例子。每一个值都有一个与其关联的类型,类型决定了能在对应的值上进行哪些运算。例如对于数字类型的值,就能对其调用进行数学计算的函数,字符串类型的值,就可以调用跟字符串相关的函数,例如获取字符串的长度。

值的声明以及定义

声明一个值后就可以将值绑定到一个标识符上去了,这样就可以通过标识符在之后(同一个作用域Scope内)引用这个值。需要注意的是,声明值并把值绑定上去之后,标识符所引用的值就是不可变的了。这意味着一旦将一个值通过定义,绑定到其声明的标识符上,此标识符就永远引用这个值了,而不可能在之后转而引用其他的值,即使其他的值是同样的类型。要声明一个值,需要使用val关键字Keyword将一个标识符绑定到一个类型上去,语法如下例所示:
  1. val str: String
复制代码
其中的“str”可以是任意合法的标识符(不是关键字,非数字开头,主要包含字母、数字、下划线),“String”表示这个值为字符串类型。一般来说,值需要在声明之后立即进行定义(除非当前作用域内允许进行abstract的声明),语法如下例所示:
  1. val str: String = "bar"
复制代码
这里String类型的值"bar"绑定到了str标识符上,例如在Scala REPL中,之后就可以通过输入str来引用"bar"这个值了。

变量的声明以及定义

声明变量跟声明值几乎是同一个语法,区别在于变量是可变的,也就是说,在声明变量并把值绑定上去之后,还可以用新的值替换掉旧的值重新绑定上去,只要类型是匹配的。要声明一个值,需要使用var关键字将一个标识符绑定到一个类型上去,语法如下例所示:
  1. var count: Int
复制代码
其中的“count”是标识符,“Int”表示这个值的类型为整型数字。同样大多数情况下,变量需要在声明之后立即进行定义,语法如下例所示:
  1. var count: Int = 0
复制代码
这样就把Int类型的值0绑定到了count标识符上。

函数的声明以及定义

函数的作用是对值进行计算并返回结果值,而用Scala进行编程也就是对函数进行组合,最终组合出程序的过程。要声明一个函数,需要使用def关键字将一个标识符绑定到一个函数类型上去,例如
  1. def foo: Boolean
复制代码
这样就声明了一个叫做“foo”,返回值类型为“Boolean”的函数。函数声明可以包含参数列表Parameter clause,参数列表可以有任意多个参数:
  1. def alwaysTrue(): Boolean
  2. def not(x: Boolean): Boolean
  3. def and(x: Boolean, y: Boolean): Boolean
复制代码
指定参数为默认参数Default Argument
  1. def isEmpty(s: String, ignoreWhitespace: Boolean = true): Boolean
复制代码
最后一个参数可以是变长参数Repeated Parameter
  1. def makeList(x: String, xs: String*): List[String]
复制代码
参数列表可以有多个:
  1. def assert(message: String)(cond: Boolean): Unit
复制代码
同样除非当前作用域内允许进行abstract的函数声明,否则需要立即定义函数的实现,语法如下例所示:
  1. def not(x: Boolean): Boolean = !x
复制代码
这里“!x”的值将作为函数的返回值。

函数调用

函数调用Function Application将参数代入函数并计算出返回值,语法如下例所示:
  1. foo
  2. alwaysTrue()
  3. not(true)
  4. and(true, false)
  5. isEmpty("")
  6. isEmpty("    ", false)
  7. isEmpty(s = "bar", ignoreWhitespace = false)
  8. makeList("a")
  9. makeList("a", "b", "c")
  10. makeList("a", Seq("b", "c"): _*)
  11. assert("bar")(false)
复制代码

语句块

语句块Block用于将多个语句Statement表达式Expression依次组合成一个表达式。所有的表达式都有一个值,语句则相反不具有值。语句块的最后一项表达式的值为整个语句块的值,如果最后一项不是表达式,则整个语句块的值为“Unit”类型的唯一值“()”,此类型将在下一节详细介绍。表达式的语法如下例所示:
  1. {
  2.   val a: Int = 1
  3.   val b: Int = 2
  4.   val sum: Int = a + b
  5.   println(sum)
  6.   sum
  7. }
复制代码
值、变量、函数定义也可以是一个语句块,例如:
  1. val a: Int = {
  2.   val temp: Int = 0
  3.   temp + 1
  4. }
  5. var b: Int = {
  6.   val temp: Int = a
  7.   temp + 2
  8. }
  9. def foo(x: Int, y: Int) = {
  10.   val sum: Int = x + y
  11.   sum
  12. }
复制代码


第一页 上一页 下一页 最后一页