Scala中的变量和基本类型

162 阅读5分钟

阅读时间: 5 分钟

Scala中的值赋值

和许多语言一样,Scala中的变量赋值也分为两部分,一个是声明,另一个是赋值运算符,即等号。Scala中的变量和基本类型与我们在Java和其他语言中发现的差不多。

变量声明以一个关键字开始,后面是一个空格,然后是一个变量名。然后是一个空格,后面是一个冒号,接着是你想和变量关联的类型。对于值,我们要么提供一个字面值,要么通过执行一个表达式或调用一个返回值的方法。Scala使用类型推理,根据分配的值来确定变量的类型。

使用var关键字,我们可以随时进行重新赋值,但是使用val关键字,我们不能再次重新赋值,如果我试图重新赋值val,那么它会抛出一个错误,它说对一个使用val关键字声明的变量进行重新赋值。

在Scala中,除非有强烈的要求使用var关键字,否则任何时候都应该使用val关键字。

Scala中的基本类型

在Scala中,所有东西都是一个对象,每个对象都有一个类型。让我们看看Scala中的基本类型是如何组织的。在顶层,我们有一个叫做Any的类型。这是类型层次结构的根。这意味着我们创建的每个对象都继承自Any。它又被分为两个子类型:AnyValAnyRef

在这个图中有九种AnyVal类型,即**Byte,Short, Char, Int, Long, Float, Double,Boolean, 和Unit。这些都是类似于原始类型的工作。

AnyRef指任何本质上继承自java.lang.object的对象。这包括字符串类、数组、列表或任何你在Scala中创建的类。在Scala中,有一种优雅的方式来表示一个在编译时可能不存在的值的想法,即使用Option

让我们看看Scala的AnyVal的类型。

val anInt: Int = 5                    // create an instance of type Integer
val aDouble: Double = 3.2             // create an instance of type Double
val aFloat: Float = 1.3f              // create an instance of type Float
val aLong: Long = 19999L              // create an instance of type Long
val aShort: Short = 12                // create an instance of type Short
val aByte: Byte = 1                   // create an instance of type Byte

这些类型的所有实例都被归类为数字类型,因为它们存储的是数字值。也有一些非数字类型,比如Char,以及其他一些类型。

val aChar: Char = 'c'            // create an instance of type Char
val aUnit: () = ()               // Unit type
val aFalse: Boolean = false      // create an instance of type Boolean

我创建了一个Unit类型的变量。Unit类型有一个值,由一个开头和结尾的小括号表示。Unit类型主要用于函数中,表示没有返回值。

如果我试图给Unit类型赋值,我会得到警告,因为表达式总是返回一个值,这与Unit类型不一致。最后一个非数字类型是一个布尔型,有两个值,即false和true。

我们来看看Scala的AnyRef类型的例子。

如果我们在API文档中搜索数组并寻找它的超级类型,我们就会发现数组继承自**AnyRef,所以让我们创建数组**的实例吧

val arr: Array[Int] = Array(1,2)

我声明数组为Integer类型,并用两个数字1和2来初始化它。要初始化数组,你需要调用Array,然后打开一个括号,并提供由逗号分隔的数值,然后关闭括号。请记住,数组中的所有值必须是同一类型。

我们看到,Null位于AnyRef的底部,小写的 "null"是它唯一可以拥有的实例值。

val aNull: Null =null

我创建了一个Null类型的变量,用小写的 "null "作为实例值,这似乎已经成功了。但是,如果我把一个字符串字面分配给一个Null类型,我得到的错误是类型不匹配。

val aNull: Null = " a null" // type mismatch error we get

Nothing类型是在每个类型的底部。有趣的信息是,这个类型不存在实例。那么这有什么用呢?Nothing类型的一个主要好处是,当计算没有正常发生时,可以把它作为一个返回类型,也就是发出失败的信号。

事实上,如果我们看一下scala.sys包,我们会看到Nothing的返回类型被exit和error等方法所使用。

Scala中的表达式和语句

表达式是指能产生一个值的东西。

x = 10
y = 20
x + y                           // Yields 30 as a result

例如,如果我们将两个数字相加,我们会得到加法的结果作为评估的一部分。所以加法在这里是一个表达式。

另一个例子是一个函数,它接收一个数字并返回该数字的平方作为结果。

getSquareOf(number) // Yields the square of the given number

在这种情况下,函数是一个表达式,因为它产生了一个值。

在另一方面,语句是一行做某事的代码。例如,在控制台打印该语句,就会打印出数值,但它并不返回任何东西。

例如 -

print("Hello World") // Prints the text on the console

所以语句不是一个表达式。同样,如果你有一个方法或一个函数做某事,例如订购比萨饼的函数,它接受订单,这里就是一个语句。

order(pizzas) // Submits an order

表达式和语句的关键区别在于,表达式不包含副作用,而语句在你的代码中可能包含副作用,如写入文件系统,连接到网络,等等。

在函数式编程中,推荐编写表达式,因为它们产生一个值。所以测试它们很容易,因为它们不包含任何副作用。在Scala中,块的最后一行是返回值。