2 表达式 选择 循环 函数

Scala中,几乎所有的语法结构都是有值的(包括表达式和语句块...)

1 IF/ELSE结构

val s = if(x > 0) 1 else -1

等价于 if(x > 0) s = 1 else s = -1

注:既然表达式是有值的,那么必然也是有类型的。如上述表达式的类型是:Int

如果出现if分支和else分支类型不同,比如:if(x > 0) ”positive” else -1,那么整个表达式的类型是:String和Int的公共基类Any

如果一个表达式没有任何有效值,可以用Unit表示其类型,用()表示,相当于C++中的void:

如:if(x > 0) 1 else ()

默认情况下,Scala解释器只能解释一行代码,如果你想使用多行代码,如:

if(x > 0) 1

else if(x == 0) 0 else -1

则必须在else前加上{},如:

if(x > 0) {1

} else if(x == 0) 0 else -1

2 语句的结束

Scala中的语句结束时不需要加分号,除非一行内写了多条语句,如:

if (n > 0) {r = r * n; n -= 1}

如果想将一行比较长的语句写在多行中,断行时只要第一行最后一个字符不能作为语句结束符即可,例如:+ - …

s = s0 + s1 + s2 –

s3 –s4

如果是语句块的话,最好使用{,如:

if (n > 0){

r = r * n

n -= 1

}

3 Scala的语句块

在Scala中,语句块{..}的结果是一个表达式,该语句块的值就是块中最后一个表达式的值

在Scala中,赋值语句的返回类型为Unit,因此不能出现链式赋值,如:x = y = 1,这是错误的

4 输入输出

输出:

print(“benxintuzi”)                           不带换行符

println(“benxintuzi”)                         带换行符

printf(“Hello, %s\n”, “benxintuzi”)           格式化输出

输入:

var name = readLine(“Your name :”),用于从控制台读取一行输入,其中的参数”Your name :”为提示符,此外,还可以如下读取不同类型的内容:

val v1 = readInt()/readDouble()/readByte()/readShort()/readChar()

5 循环

While/do循环结构与C++、Java无异

Scala中的for循环结构如下:

for(i <- 表达式)

例如,for(i <- 0 util s.length){ // [0, s.length - 1]

Sum += s(i)

}

说明:Scala中并没有提供break或者continue来退出循环,如果想实现退出循环,则可以使用如下方式:

1 使用Boolean型的控制变量

2 使用嵌套函数,从函数中return

3 使用Breaks对象中的break方法,如:

import scala.util.control.Breaks._

breakable{

for(…){

if(…) break;  // 退出breakable块

}

}

for循环的高级特性:

特性1:for(i <- 1 to 3; j <- 1 to 3) print(…) // 多个表达式

特性2:for(i <- 1 to 3; j <- 1 to 3 if i != j) print(…) // 注:只能加一个判断,并且前边不能有分号

特性3:for(i <- 1 to 3; from = 4 – i; j <- from to 3) print(…) // 可以使用任意多个定义

特性4:for(i <- 1 to 10) yield i % 3 // 以yield开始的循环体会构造出一个结果集合:Vector{1, 2, 0, 1, 2, 0, 1, 2, 0, 1}

6 Scala函数

1 非递归函数定义时可以不给出函数返回类型:

def abs(x : Int) = if(x >= 0) x else –x

2 递归函数必须给出返回类型:

def fact(n : Int) : Int = if(n <= 0) 1 else n * fact(n - 1)

如果没有类型,Scala解释器无法确定n * fact(n - 1)的类型是Int(回忆一下: C/C++中的结构体中,不能有包含自身的变量,但是可以有指向自身的指针,就是因为编译器无法确定结构体的大小)

3 默认参数和指定参数

def decorate(str : String, left : String = “[”, right : String = “]”) = left + str + right // left和right都带有默认值

调用decorate(“benxintuzi”)-----[benxintuzi]

调用decorate(“benxintuzi”, “<”, “>”)-----<benxintuzi>

注:在调用时,可以显示指定某个参数的值,其顺序没必要和定义时一致,如:

decorate(left = “((”, str = “tuzi”, right = “))”)-----((tuzi)) [但是不建议这样做,最好保持定义时的顺序]

4 变长参数

def sum(agrs : Int*) = {

var result = 0

for(arg <- args) result += arg

result

}

可以使用任意多个参数调用sum,如:val s = sum(1, 2, 3)

注意:如果传入的是单个区间,如val s = sum(1 to 5),则必须告诉编译器将这个参数当作序列Seq来处理,具体如下:

val s = sum(1 to 5 : _*),该语法在递归函数中常用

7 过程

如果一个函数不需要返回有效值,可以使用过程来表示,具体如下:

def box(s : String){

Var border = “-” * s.length + “--\n”

Println(border + “|” + s + “|\n” + border)

}

等价于:

def box(s : String) : Unit = {

Var border = “-” * s.length + “--\n”

Println(border + “|” + s + “|\n” + border)

}

8 Lazy Value

当val被声明为lazy时,其初始化将被推迟到首次对其调用时:

Lazy val words = scala.io.Source.fromFile(“/usr/share/dict/words”).mkSring

只有调用words时,才会打开这个文件。该机制对于开销比较大的初始化语句十分有效。

9 异常

Scala中的异常机制与C++和Java类似。比如,throw new IllegalArgumentException(“x should not be negative”)

和Java一样,抛出的异常对象必须是java.lang.Throwable的子类。

throw表达式的类型是Nothing

捕获异常采用的是模式匹配语法:

try{

Process(new URL(“…”))

} catch{

case _ : MalformedURLException => println(“Bad URL”)

case ex : IOException => ex.printStackTrace()

}

注:在不需要使用捕获到的异常时,用 _ 代替变量名

                                                                -----源自《快学Scala》 Chapter 2

时间: 2024-10-12 03:48:52

2 表达式 选择 循环 函数的相关文章

typeJavaScript笔记----字符串,参数,函数,表达式,循环

一.字符串新特性--双丿(撇)号声明字符串 .多行字符串 var myName = `fang my hao li jsk c sdf` //这样不会报错. .字符串模板 console.log(`qsdaf ${myName}`) console.log(`qsdaf ${myName()}`)//函数和变量可以直接写这里面${} console.log(`<div> <span>${myName}</span> </div>`)//这样就可以很快的写出来

python3_04.循环&函数

1.循环&条件控制 注意: 每个条件后面要使用冒号(:),表示接下来是满足条件后要执行的语句块. 使用缩进来划分语句块,相同缩进数的语句在一起组成一个语句块. break 语句可以跳出 for 和 while 的循环体. continue语句被用来告诉Python跳过当前循环块中的剩余语句,然后继续进行下一轮循环. pass是空语句,是为了保持程序结构的完整性.pass 不做任何事情,一般用做占位语句. 循环技巧: 在字典中循环时,关键字和对应的值可以使用 items() 方法同时解读出来 在序

python顺序选择循环使用

格式化输出 顺序选择循环结构 简单使用 查看某个模块.内置函数或者某个对象使用帮助help([module|object.ways]) 格式化输出 将代码按照指定格式输出:%对字符串进行格式化,\用来做转义 格式符:%c:显示字符的ASCII码%d,%i:显示十进制整数%e:科学计数法数值显示%f:浮点数%s:字符串%%:显示%修饰符:#[.#]:第一个#数字控制显示的宽度,第二个表示小数点的精度-:左对齐+:显示数值的符号 顺序选择循环结构:格式强要求! 分支结构,单分支.双分支,多分支: i

循环 函数 软件包 【中】

循环 函数 软件包  [中] 创建无限循环 while true; do 循环体 done until false; do 循环体 Done 特殊用法 while循环的特殊用法(遍历文件的每一行): while read line; do 循环体 done < /PATH/FROM/SOMEFILE 依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将 行赋值给变量line 示例 [[email protected] bin]# bash wenben.sh #! # read -

HTML-JS 循环 函数 递归

[循环结构的执行步骤] 1.声明循环变量 2.判断循环条件 3.执行循环体操作 4.更新循环变量 然后,循环执行2-4,直到条件不成立时,跳出循环. while循环()中的表达式,运算结果可以是各种类型,但是最终都会转化为真假 转化规则同if结构. while循环特点:先判断,再执行.do-while循环特点:先执行,再判断:即使初始条件不成立,do-while循环也至少执行一次. // var num=1;//1.声明循环变量// while (num<=10){//2.判断循环条件// do

Java自学笔记(第三天)-while循环-do while循环-for循环-函数-函数重载

(1)while循环,do while循环:的区别,while是先判断条件,再执行语句. do while是先执行一遍语句,再判断条件. while(循环条件表达式){                do{ 执行语句:                           执行语句: }                                              }while(循环条件表达式); (2)for循环: for(初始化表达式:循环条件表达式:循环后的操作表达式){ 执行语

T-SQL的基础:超越基础6级:使用CASE表达式和IIF函数

                                                                                                                                                          T-SQL的基础:超越基础6级:使用CASE表达式和IIF函数                                                                 

第九周翻译:使用CASE表达式和IIF函数

通往t - sql的阶梯:超越基本级别6:使用CASE表达式和IIF函数    在2016年4月20日被Gregory Larsen所创作,第一次出版于2014年4月9日. 这一系列: 这篇文章是阶梯系列的一部分:楼梯T-SQL:超越基础 下面就从他的楼梯T-SQL DML.Gregory Larsen覆盖的T-SQL语言如子查询更先进的方面. 很多时候,你需要写一个TSQL语句,能够返回基于另一个表达的评价不同的TSQL表达式.当你需要这种功能,你可以使用CASE表达式或IIF函数满足这个要求

楼梯T-SQL:超越基础6级:使用CASE表达式和IIF函数

从他的楼梯到T-SQL DML,Gregory Larsen涵盖了更多的高级方面的T-SQL语言,如子查询. 有时您需要编写一个可以根据另一个表达式的评估返回不同的TSQL表达式的单个TSQL语句.当您需要这种功能时,您可以使用CASE表达式或IIF函数来满足此要求.在本文中,我将回顾CASE和IIF语法,并向您展示CASE表达式和IIF函数的示例. 了解CASE表达Transact-SQL CASE表达式允许您在TSQL代码中放置条件逻辑.此条件逻辑为您提供了一种在TSQL语句中放置不同代码块