Scala坑二(控制结构和函数)
2015-11-18 10:39
120 查看
在Scala中几乎所有构造出了的语法结构都有值
if(x > 0) 1 else 0 把值赋给变量 val s = if(x >0) 1 else 0 也可以 if(x >0) s = 1 else s = 0
if( x >0 ) "haha" else 0 混合类型表达式, (String)和(Int)公共超类型叫做 Any
表达式都有值,void 类型相当于 Unit 类 写做 ()。所有不带else的if语句等同于 if( x > 0 ) 1 else ()
如val distanc= { val dx = x - x0 ; val dy = y - y0; sqrt(dx * dx + dy * dy)}
注意::在Scala中赋值动作本身是没有值得或者说他们的值是Unit类型 { r = r * n; n-=1}表达式的值是Unit
同样的 x=y=-1 也是Unit类型 y=-1的值是()
r = r * n;
n-=1
}
for(i <- 1 to n)
r = r * 1
for( i <- 表达式) 表示让变量 i 遍历 <- 右边的表达式的所有值
如果类型是数值 用 to ;如果类型是字符串或数组是用 until方法 i <- 0 util str.length
每个生成器带一个守卫,以if开头的Boolean表达式 for( i <- 1 to 3; j <- 1 to 3 if i != j ) print ((10 * i +j ) + " ") 12 13 21 23 31 32 if之前没有分号
任意多的定义,for( i <- 1 to 3 ; from = 4 - i; j <- from to 3) print ((10 * i +j ) + " ") 13 22 23 31 32 33
for推导式
for循环体以yieid 开始,该循环会构造出一个集合,每次迭代生成集合中的一个值
for(i <- 1 to 10)yieid i % 3 生成 Vector(1,2,0,1,2,0,1,2,0,1)
for推导式生成的集合与它第一个生成器是类型兼容的
如 for(c< - "hello"; i<- 0 to 1)yieid (c+1).toChar 生成 "HIeflmlmop"
for( i< - 0 t o 1;c< - "hello")yieid (c+1).toChar 生成Vector('H','I','e','f','l','m','l','m','o',p') ;
函数的定义,需要函数的名称,参数,和函数体
def abs(x : Double) = if (x > 0 ) x else -x
必须要指定所有参数的类型,如果函数不是递归的,就不需要指定返回类型
如果函数体需要多个表达式完成,可以用代码块,块中最后一个表达式的值就是函数的返回值
def fac(n : Int) = {
var r = 2
for(i <- 1 to n) r = r * 2
r //函数的值
}
对于递归函数必须指定返回值
def fac(n : Int) : Int = if (n <= 0 ) 1 else n * fac( n - 1)
在调用时指定参数名,顺序没有规定 deco(left="<<",str = "hello",right=">>")
def sum (args: Int*)= {
var reult = 0
for (arg -> args) reult +=arg
reult
}
val s = sum(1,2,3,4)
val s = sum(1 to 10:_*) :_* 将参数序列处理
函数体有花括号但是前面没有 = 号的,那么返回类型是Unit
def bos(s : String) {
print(s)
}
或者
def bos(s : String):Unit = {
print(s)
}
lazy val words = scala.io.Source.fromFile("...").mkString
当words被首次使用时取值
1.条件表达式
不同java,Scala的if/else语法结构有值,值是跟在if或者else后面的表达式的值if(x > 0) 1 else 0 把值赋给变量 val s = if(x >0) 1 else 0 也可以 if(x >0) s = 1 else s = 0
if( x >0 ) "haha" else 0 混合类型表达式, (String)和(Int)公共超类型叫做 Any
表达式都有值,void 类型相当于 Unit 类 写做 ()。所有不带else的if语句等同于 if( x > 0 ) 1 else ()
2.语句终止
可以不使用分号3.块表达式和赋值
{ }块包含一系列的表达式,结果也是一个表达式,块中最后一个表达式的值就是块的值。如val distanc= { val dx = x - x0 ; val dy = y - y0; sqrt(dx * dx + dy * dy)}
注意::在Scala中赋值动作本身是没有值得或者说他们的值是Unit类型 { r = r * n; n-=1}表达式的值是Unit
同样的 x=y=-1 也是Unit类型 y=-1的值是()
4.输入输出
用print和println5.循环
while( n > 0 ){r = r * n;
n-=1
}
for(i <- 1 to n)
r = r * 1
for( i <- 表达式) 表示让变量 i 遍历 <- 右边的表达式的所有值
如果类型是数值 用 to ;如果类型是字符串或数组是用 until方法 i <- 0 util str.length
6.高级的for循环和for推导式
多个生成器 for(i <- 1 to 3;j <- 1 to 3)print ((10 * i +j ) + " ") 11 12 13 21 22 23 31 32 33每个生成器带一个守卫,以if开头的Boolean表达式 for( i <- 1 to 3; j <- 1 to 3 if i != j ) print ((10 * i +j ) + " ") 12 13 21 23 31 32 if之前没有分号
任意多的定义,for( i <- 1 to 3 ; from = 4 - i; j <- from to 3) print ((10 * i +j ) + " ") 13 22 23 31 32 33
for推导式
for循环体以yieid 开始,该循环会构造出一个集合,每次迭代生成集合中的一个值
for(i <- 1 to 10)yieid i % 3 生成 Vector(1,2,0,1,2,0,1,2,0,1)
for推导式生成的集合与它第一个生成器是类型兼容的
如 for(c< - "hello"; i<- 0 to 1)yieid (c+1).toChar 生成 "HIeflmlmop"
for( i< - 0 t o 1;c< - "hello")yieid (c+1).toChar 生成Vector('H','I','e','f','l','m','l','m','o',p') ;
7.函数
方法是对象进行操作的,函数不是,在java中只能用静态方法模拟函数函数的定义,需要函数的名称,参数,和函数体
def abs(x : Double) = if (x > 0 ) x else -x
必须要指定所有参数的类型,如果函数不是递归的,就不需要指定返回类型
如果函数体需要多个表达式完成,可以用代码块,块中最后一个表达式的值就是函数的返回值
def fac(n : Int) = {
var r = 2
for(i <- 1 to n) r = r * 2
r //函数的值
}
对于递归函数必须指定返回值
def fac(n : Int) : Int = if (n <= 0 ) 1 else n * fac( n - 1)
8.默认参数和带名参数
def deco(str : String, left : String ="[",right="]")={ left + str + right} 调用deco("hello")得到 "[hello]" 也可以 调用 deco("hello","<<",">>") 得到 “<<hello>>”在调用时指定参数名,顺序没有规定 deco(left="<<",str = "hello",right=">>")
9.变长参数
一个接收可变长度参数def sum (args: Int*)= {
var reult = 0
for (arg -> args) reult +=arg
reult
}
val s = sum(1,2,3,4)
val s = sum(1 to 10:_*) :_* 将参数序列处理
10.过程
对于没有返回值得函数,成为过程函数体有花括号但是前面没有 = 号的,那么返回类型是Unit
def bos(s : String) {
print(s)
}
或者
def bos(s : String):Unit = {
print(s)
}
11.懒值
当val 被声明为lazy时,初始化会被推迟,直到首次对其取值lazy val words = scala.io.Source.fromFile("...").mkString
当words被首次使用时取值
12.异常
异常机制个java差不多相关文章推荐
- Scala坑二(控制结构和函数)
- Scala坑二(控制结构和函数)
- Scala坑二(控制结构和函数)
- Scala坑二(控制结构和函数)
- Scala坑二(控制结构和函数)
- Android Diaolog与AlertDialog用法实例
- Scala坑二(控制结构和函数)
- Scala坑二(控制结构和函数)
- Scala坑二(控制结构和函数)
- Scala坑二(控制结构和函数)
- 用第三方SDWebImage下载网上的图片
- Python 学习一
- 内核线程、轻量级进程、用户线程 http://blog.csdn.net/hsly_support/article/details/7397103
- 软件测试专业技术之Linux篇
- LeetCode() Search a 2D MatrixII
- java jvm学习笔记二(类装载器的体系结构)
- Scala坑二(控制结构和函数)
- Ubuntu 12.04 KVM之VM动态迁移—iscsi存储
- Scala坑二(控制结构和函数)
- Scala坑二(控制结构和函数)