scala学习之路(二)控制结构和函数

Scala(二)控制结构和函数

  1. 条件表达式
  2. 语句终止
  3. 块表达式和赋值
  4. 输入和输出
  5. 循环
  6. 函数
  7. 默认参数和带名参数
  8. 变长参数
  9. 过程
  10. 懒值
  11. 异常

1. 条件表达式




两个表达式的都是相同类型时,返回类型是相同的;

***因为每个表达式都必须有返回值,如果不想返回值,则可以用Unit类写做 ()

***注意:在REPL中同一时间只能看到一行代码。

这将不知所措
可以使用花括号

如果想粘贴块状代码,而不想担心这个问题可以使用粘贴模式,输入

2. 语句终止


单行写下多个语句,需要将它们用分号隔开; {}结尾不需要使用分号
if (n>0) { r=1;n=-1}
一条语句使用多行,使用操作符 告诉解析器不是语句的结尾
s = s0 + (v -v0) * t +
0.5 * (a - a0) * t * t

*scala 单行写一条语句可以不需要使用分号

3. 块表达式和赋值

在scala中,{ }块包含一系列表达式,其结果也是一个表达式。块中的最后一个表达式的值就是块的值。
val x = {val b = 2+1 ; val c = 7-1; sqrt(4) }

在scala中以赋值语句结束的块是没有值的,即Unit类型。


4. 输入和输出

输出语句
print("content")
println(12) //打印后换行
printf("Hello, %s ! You are %d years old \n." ,"name" ,18)
print(f"Hello, $name! In six months you will be ${age + 0.5 }%7.2f years old. \n")
//变量的值,%7.2宽度为7,精度为2的浮点数格式。

输入语句
使用scala.io.StdIn的readLine方法从控制台读取一行输入,如果是要读取数字,Boolean者字符串,
可以用readInt,readDouble,readByte,readShort,readLong,readFloat,readBoolean,readChar.

readLine可以带一个参数作为提示符:
val name = readLine("Your name: ")
print("Your age: ")
val age = readInt()
println("Hello " + name + ", Next year you will be " + (age + 1) )


5. 循环

while 循环
whiel(n>0){
    print("hello world")
}

for 循环
for( i 

6. 函数


def fac(n: Int) = {
var r = 1
for(i <- 1 to n) r = r * i
r
}

在本例中我们不需要用到return。我们也可以像java或C++那样使用return,以立即从某个函数中退出,不过在Scala中这种做法并不常见。

**对于递归函数,我们必须指定返回类型:
def fac(n : Int): Int = if (n <=0 ) 1 else n
fac(n - 1)
如果没有返回类型,Scala编译器就无法校验n * fac(n - 1) 的类型是Int。


7. 默认参数和带名参数


在调用某些函数时并不显式的给出所有参数值,对于这些函数我们可以使用默认参数

def decoreate(str: String, left: String = "[", right: String = "]") =
left + str + right

这个函数有连个参数,left和right,带有默认值 "["和"]"
调用 decorate("hello") > "[hello]"

混用未命名参数和带名参数,将未命名参数排在前面


8. 变长参数


实现一个可以接受可变长度参数列表的函数

def sum(args: Int*) = {
var result = 0
for(arg <- args) result += arg
result
}

可以使用任意多的参数来调用该函数
val s = sum(1,2,3,4,5,6)

有值序列不能直接传入
val s = sum(1 to 6) //错误
val s = sum(1 to 6 : _*) //正确,将1 to 6 当做参数序列处理


9. 过程


如果函数体包含在花括号当中但没有前面的 = 号,那么返回类型就是Unit。这样的函数被称为过程(proceduce)。不返回值

def box(s : String){ //没有=号
val border = "-" * (s.length + 2)
print(f"$border")
}

等价与

def box(s : String) : Unit = {
.....

}


10. 懒值


当val被声明为lazy时,它的初始化将被推迟,直到我们首次对它取值。

val words = scala.io.Source.fromFile("/usr/bin/words") //在word被定义时即被取值

lazy val words = scala.io.Source.fromFile("/usr/bin/words") //在word被首次使用时取值

***懒值并没有额外的开销。我们每次访问懒值是,都会有一个方法被调用,而这个方法将会以线程安全的方式检查该值是否已被初始化。


11. 异常


Scala没有“受检”异常——不需要声明函数或方法可能会抛出某种异常。

throw表达式有特殊的类型nothing。这在if/else表达式中很有用。
if(x >= 0){
    sqrt(x)
}else throw new IllegalArgumentException("x should not be negative")

第一个分支类型是Double,第二个分支类型是nothing。因此,if/else表达式的类型是Double。

try {.....} catch {......} finally {......}

转载于:https://www.cnblogs.com/Thomas-blog/p/9728240.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值