跳至主要内容

Scala 中的变量

了解 Scala 的变量、定义变量的规则、不同类型的变量、多重声明与赋值,以及变量的作用域。
· 10分钟 阅读

使用 AI 探索

查看 DataCamp 新上线的 Scala 课程:Introduction to Scala。

Scala 在大数据领域与 Apache Spark 搭配使用时,被数据科学家广泛采用以处理海量数据。它既是面向对象的语言,也是函数式编程语言,并具备许多其他重要特性,概括如下:

  1. Scala 是静态类型语言,变量在使用前必须定义数据类型。类型检查在编译时完成,而非运行时。
  2. 它还是一种“强类型”语言,变量在参与运算前会进行类型检查。
  3. 它支持类型推断,编译器可以根据表达式或字面量推断类型,因此声明变量类型是可选的。

在本教程中,您将学习以下主题:

变量

变量是内存中的具名空间,编译器会根据相应变量的数据类型分配保留的存储位置。Scala 中变量按如下语法声明:

val or val variable_name: variable_datatype = value;

在上述语法中,变量可以使用“var”或“val”两种关键字之一来定义。先写“variable_name”作为新变量名,后跟冒号。变量的数据类型为“variable_datatype”,可以是任意有效的数据类型。之后将“value”赋给“variable_name”。

例如:

val varValue: Byte = 8;

“val”是定义变量的关键字,“varValue”是变量名。它的数据类型为“Byte”,值为 8。Byte 是 8 位有符号值,取值范围为 2−7 到 27−1。

上述“variable_datatype”可以是 Scala 中的任意数据类型,例如:

  1. Int:32 位有符号(正或负)整数,取值范围为 2−31 到 231−1。
  2. Byte:8 位有符号整数,取值范围为 2−7 到 27−1。
  3. Short:16 位有符号整数,取值范围为 2−15 到 215−1。
  4. Float:可以是 32 位或 64 位。

类似地,其他数据类型如 Long、Char、Boolean、Char、String、Boolean、Null 也各自有其范围,更详尽的说明见教程 Beginner’s Guide to Scala。另外,“variable_datatype”应以大写字母开头,例如 Int 的“I”,这也表明上述数据类型在 Scala 中都是对象。

在 Scala 中定义变量的规则

在 Scala 中定义变量的规则与约定如下:

  1. 变量名采用小驼峰命名。例如变量名“nameOfGirl”以小写字母“n”开头,之后每个单词的首字母如“O”和“G”大写。
  2. 变量名不得使用 Scala 中的保留字或关键字。
  3. 变量名可以包含美元符号“$”和下划线“_”,但不允许其他特殊字符(如“#”“&”等)。同时,不鼓励使用下划线。
  4. 变量名中不允许出现空白(制表符、空格)。
  5. 变量名必须以字母开头,不能以数字或其他字符开头。

可变变量

可变变量允许在变量声明之后修改其值。

可变变量的语法如下:

var variable_name : variable_datatype = value;

可变变量也可以按如下方式定义:

var variable_name = value;

可变变量示例如下:

var nameOfThing: String = "Car";

以上示例使用关键字 var 来定义可变变量。变量名为“nameOfThing”,后跟冒号,变量类型为“String”。其在内存中存储的值为“Car”。

上述可变变量也可用不同语法书写如下:

var nameOfThing = "Car";

如上所示,您可以不显式声明变量的数据类型。Scala 编译器会自动将其判断为“String”类型,这称为类型推断。

您可以像下面这样轻松修改变量的值:

nameOfThing = "Bike";
print(nameOfThing)

变量的值将从“Car”变为“Bike”。输出为“Bike”,因为关键字“var”允许您更改变量的值(来源:Variables in Scala)。

不可变变量

不可变变量一经创建其值便不可更改,使用“val”关键字声明。

不可变变量的语法如下:

val variable_name : variable_data type = value;

不可变变量也可按如下方式定义:

val variable_name = value;

不可变变量示例如下:

val numberOfThing: Int = 2;

以上示例使用关键字 val 来定义不可变变量,变量名为“numberOfThing”。随后是冒号与变量类型“Int”,存储在内存中的值为 2。

上述不可变变量也可用不同语法书写如下:

val numberOfThing = 2;

如上所示,您可以不显式声明变量的数据类型,Scala 编译器会自动判断其为“Int”类型。该过程称为类型推断(来源:Variables in Scala)。

您不能像下面这样更改变量的值:

numberOfThing = 7;

上述代码将导致错误,例如“error: not found: value numberOfThing”,表明不允许重新赋值,如下所示:

error

多重声明与赋值

在 Scala 中,可以使用“var”关键字进行多重声明,变量名用逗号分隔,并使用“=”为变量赋值。

var (x, y, z) = (5, 4.5, "Sit")

在上述示例中,您可以看到变量 x、y、z 分别被赋值为 5、4.5 和 “Sit”。

variables

同样地,也可以在一行中使用“val”关键字进行多重赋值,变量名用逗号分隔,并使用“=”为变量赋相同的值。

val a, b, c = 1;

在上述示例中,变量 a、b、c 都被赋值为 1。

variables

变量的作用域

作用域指变量在特定代码块内的可见性与生命周期。变量可以定义在局部作用域或全局作用域中。例如:

var globalVar = 10
def sub(){
var difference = 9-4;
}
print(difference)//Error
print(globalVar)//Valid

在上述代码中,变量“difference”处于局部作用域,它在方法“sub”内部声明,减法运算在该方法内有效,但在方法“sub”之外打印其值会导致错误。与此同时,全局作用域中的变量“globalVar”可以在程序的任意位置访问并进行操作。

Scala 中变量有三种作用域(来源:Scala- Variables):

  1. 局部变量
  2. 字段
  3. 方法参数

局部变量

局部变量是在方法内部声明的可变或不可变变量,只能在该方法内访问,方法外不可见。

您可以参考下面的简单示例来了解局部变量:

class Perimeter  
{
    def triangle()  
    {
        var side1 = 10;
        var side2 = 20;
        var side3 = 30;

        var total = side1+side2+side3;
        print("Perimeter of the  triangle is: " + total);
    }
}

object Test  
{

    def main(args:Array[String])  
    {
        val p1 = new Perimeter()
        p1.triangle()
    }
}
defined class Perimeter
defined object Test

上述代码的输出为:

The perimeter of the triangle is: 60

该程序包含一个名为“Perimeter”的类和一个名为“Test”的对象,其中有一个名为 triangle 的方法,包含三个可变变量 side1、side2、side3。计算与结果输出均在该方法内完成,从而得到正确结果。

字段

在类内定义的变量称为字段变量,既可以是可变的,也可以是不可变的。如果变量在类内声明但不在任何方法内,其访问修饰符默认是 public,可在程序的任意位置访问。然而,private 变量只能在其定义的类内访问,超出类的作用域(甚至在对象中)都无法访问。

class FieldExample
{
  var value1 = 10;
  private var value2 = 30;
  def operation()
  {
    println("Value of value1:"+value1)
  }
  println("Value of value2: "+value2);
}

object Demo
{
  def Main(args:Array[String])
  {
    val obj = new FieldExample()
    obj.operation()
    print(obj.value1)//Valid
    print(obj.value2)


  }
}
defined class FieldExample
defined object Demo

上述代码的输出为:

Value of value2: 30
Value of value1:10
10

该程序包含一个名为“FieldExample”的类、一个名为“Demo”的对象,以及一个名为“operation”的方法。公共变量 value1 可通过点号访问,其打印结果为 10。私有变量 value2 的值为 30,尝试在类外访问并打印将导致错误。

方法参数

方法参数是在调用方法时接收值的变量,必须是使用“val”关键字定义的不可变变量。同时,当对其建立引用时,变量也可以在方法外被访问。

您可以参考下面的简单示例来了解方法参数:

class Triangle
{
    def calculate(height: Int, width: Int)
    {
        var result = 0.5*(height+width);
        println("Area of triangle is: " + result);
    }
}

object Area  
{
     def main(args:Array[String])
    {
        val a = new Triangle()
        a.calculate(4,5);
    }
}
defined class Triangle
defined object Area

上述代码的输出为:

Area of triangle is: 4.5

该程序包含一个名为“Triangle”的类,其中的方法“calculate”带有两个方法参数 height 与 width。在通过对象实例 a 调用“calculate”时传入整数 4 和 5。

结论

恭喜您,顺利完成本教程的学习!

本教程介绍了 Scala 的变量、定义变量的规则、不同类型的变量、多重声明与赋值,以及变量的作用域。

如果您希望进一步学习 Scala,请参加 DataCamp 的 Introduction to Scala 课程。

主题