scala编程基础

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-17 00:04   78   0

第二步:定义一些变量

Scala有两种变量,val和var。val类似于Java里的final变量。一旦初始化了,val就不能再赋值了。与之对应的,var如同Java里面的非final变量。var可以在它生命周期中被多次赋值。下面是一个val的定义:

scala> val msg = "Hello, world!" msg: java.lang.String = Hello, world! 这个语句引入了msg当作字串"Hello, world!"的名字。类型是java.lang.String,因为Scala的字串是由Java的String类实现的。

如果你之前曾定义过Java变量,你会发现一个很醒目的差别:无论java.lang.String还是String都没有出现在val的定义中。本例演示了类型推断:type inference,这种Scala能自动理解你省略的类型的能力。在这个例子里,因为你用一个字串文本初始化了msg,Scala推断msg的类型是String。如果Scala解释器(或编译器)可以推断类型,那么让它这么做而不是写一些没必要的显式类型标注常常是最好的选择。不过,如果你愿意,也可以显式地定义类型,也许有些时候你也应该这么做。显式的类型标注不但可以确保Scala编译器推断你倾向的类型,还可以作为将来代码读者有用的文档。Java中变量的类型指定在其名称之前,与之不同的是,Scala里变量的类型在其名称之后,用冒号分隔。如: scala> val msg2: java.lang.String = "Hello again, world!" msg2: java.lang.String = Hello again, world!

你对msg不能做的,因为是val而不是var,就是再给它赋值。 例如,看看你做如下尝试的时候编译器怎么报错的:

scala> msg = "Goodbye cruel world!"

<console>:5: error: reassignment to val

msg = "Goodbye cruel world!"

如果可重赋值是你需要的,你应使用var,如下: scala> var greeting = "Hello, world!" greeting: java.lang.String = Hello, world! 由于greeting是var而不是val,你可以在之后对它重新赋值。比如说,如果你之后心态不平了,你可以修改你的greeting为: scala> greeting = "Leave me alone, world!" greeting: java.lang.String = Leave me alone, world!

第三步:定义一些函数

现在你已经用过了Scala的变量,或许想写点儿函数。下面是在Scala里面的做法: scala> def max(x: Int, y: Int): Int = { if (x > y) x else y } max: (Int,Int)Int
数的定义用def开始。函数名,本例中是max,跟着是括号里带有冒号分隔的参数列表每个函数参数后面必须带前缀冒号的类型标注,因为Scala编译器(还有解释器,但之后我们将只说编译器)没办法推断函数参数类型。本例中,名叫max的函数带有两个参数,x和y,都是Int类型。在max参数列表的括号之后你会看到另一个“: Int”类型标注。这个东西定义了max函数的结果类型:result type 。跟在函数结果类型之后的是一个等号和一对包含了函数体的大括号。本例中,函数体里仅有一个if表达式,选择x或者y,哪个较大,就当作max函数的结果。就像这里演示的,Scala的if表达式可以像Java的三元操作符那样产生一个值。举例来说,Scala表达式“if (x > y) x else y”与Java里的“(x > y) ? x : y”表现得很像。在函数体前的等号提示我们函数式编程的世界观里,函数定义一个能产生值的表达式。函数的基本结构在图2.1里面演示。

有时候Scala编译器会需要你定义函数的结果类型。比方说,如果函数是递归的,7你就必须显式地定义函数结果类型。然而在max的例子里,你可以不用写结果类型,编译器也能够推断它 。同样,如果函数仅由一个句子组成,你可以可选地不写大括号。这样,你就可以把max函数写成这样: scala> def max2(x: Int, y: Int) = if (x > y) x else y

一旦你定义了函数,你就可以用它的名字调用它,如: scala> max(3, 5) res6: Int = 5 还有既不带参数也不返回有用结果的函数定义: scala> def greet() = println("Hello, world!") greet: ()Unit 当你定义了greet()函数,解释器会回应一个greet: ()Unit。“greet”当然是函数名。空白的括号说明函数不带参数。Unit是greet的结果类型。Unit的结果类型指的是函数没有返回有用的值。Scala的Unit类型比较接近Java的void类型,而且实际上Java里每一个KX8.^ifc3Xz

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP