《快学scala》- 第2章 控制结构和函数

第2章 控制结构和函数

2.1 条件表达式
表达式都有值,if (x>0) 1 else -1,表达式值等于返回值,由x条件决定。
条件赋值语句,val s = if (x > 0) 1 else -1,等效于var s; if (x>0) s=1 else s=-1,后者s必须是var。
表达式都有类型,if (x>0) “positive” else -1,公共超类型Any。
if (x>0) 1,Unit类型,写做(),无输出值类型,相当于占位符。
REPL近视问题,回车后优先开始编译。换行前使用{}花括号,或使用粘贴模式,键入:paste->粘贴代码->Ctrl+D确认结束。

2.2 语句终止
使用{}花括号,输入多行内容。
使用;分号,单行写多个语句

2.3 块表达式和赋值
多个动作表达式,可以用{}组合为一个语句块。
块语句的值,是块中最后一个表达式的值。
val distance = { val dx = x - x0; val dy = y - y0; sqrt(dx * dx + dy * dy)}
赋值语句本身没有值,其返回值为Unit类型。

2.4 输入和输出
输出:
print("Answer: ")
println(42)
printf(“Hello, %s! You are %d years old.\n”,“Fred”,42)
输入:
readLine -> val name = readLine(“Your name:”)可带提示语
readInt, readDouble, readByte, readShort, readLong, readFloat, readBoolean, readChar -> vall age = readInt()不能带提示语

2.5 循环
while循环 -> while (n>0) {n = n-1}
for语句 -> for (i <- 1 to n) {r * i}
for (i <- 表达式),让变量i遍历<-右边表达式所有的值。
字符串遍历 for(ch <- “Hello”) sum += ch

2.6 ?? 高级for循环和for推导式
for (i <- 1 to 3; j <- 1 to 3) print ((10 * i + j) + " ") 多个生成器(变量<-表达式)。
for (i <- 1 to 3; j <- 1 to 3 if i != j) print ((10 * i + j) + " ")带if条件。
for (i <- 1 to 3; from = 4 - i; j <- from to 3) print ((10 * i + j) + " ")引入中间变量定义。
for (i <- 1 to 10) yield i % 3 循环体以yield开始,则会将结果构建一个集合,这类循环叫做for推导式。
for推导式生成的集合与它的第一个生成器是类型兼容的。

2.7 函数
定义函数体:函数名+参数+函数体。
函数返回值和类型为函数体最后一个表达式的值和类型。
def abs(x: Double) = if (x>=0) x else -x
递归函数,即函数的函数体调用自身函数,必须要指定返回类型
def fac(n:Int): Int = if (n<=0) 1 else n * fac (n-1)

2.8 默认参数和带名参数
函数的参数可以设置默认值。
def decorate(str:String, left:String="[",right:String="]") = left + str + right
参数数量不够时,后面的参数使用默认值,前面的参数使用调用值。
使用参数名赋值,可以避免参数顺序问题。
decorate(“Hello”) -> [Hello]
decorate(“Hello”,"<<") -> <<Hello]
decorate(left="<<", str=“Hello”,right=">>")

2.9 变长参数
星号表明为参数序列
def sum(args: Int
)={
var result=0
for (arg <- args) result += arg
result
}
调用sum(1,2,3)
参数为序列时,使用:_*,注明当作参数序列处理,而非单个集合变量。

2.10
过程
函数体前没有=等号,没有返回值,或者返回值为Unit类的函数,即可视为过程。
def box(s:String) {
var border="-"*s.length+"–\n"
println(border+"|"+s+"|\n"+border
}
或def box(s: String) :Unit = {…}

2.11 懒值
val words = …在words被定义时即被取值
lazy val words = …在words被首次使用时取值
def words = …在每一次words被使用时取值
文件操作lazy val words = scala.io.Source.fromFile("/usr/share/dict/words").mkString

2.12 异常
主动声明异常,throw,返回Nothing类型
异常处理语句try/catch
异常没找到处理方法时,程序清理语句try/finally

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值