scala-- 内建控制结构
内建控制结构
scala 内建的控制结构很少,只有 if
while
for
try
match
和函数调用
几种。 因为scala 从语法层面支持函数字面量。几乎所有的scala控制结构都会产生值.函数式语言把程序看成是计算值的活动。
if
object InBuildControl {
def main(args: Array[String]): Unit = {
var filename = "default.txt"
if ( ! args.isEmpty)
filename = args(0)
}
} // 指令式风格
object InBuildControl {
def main(args: Array[String]): Unit = {
val filename =
if (! args.isEmpty) args(0)
else "defult.txt"
println(filename)
}
} //函数式风格
println(if (! args.isEmpty) args(0) else "default.txt")
while
object InBuildControl {
def main(args: Array[String]): Unit = {
println(gcdLoop(6,4))
}
def gcdLoop(x: Long,y: Long): Long = { //这就求分子字母最大公约数的一个程序
var a = x
var b = y
while (a != 0){
val temp = a
a = b % a
b = temp
}
b
}
}
var line = ""
do{
line = readLine() //readline()该方法已经过时了
println("read" + line)
}while (line != "")
} //do...while 循环
Unit类型的值是 unit ,写为 ()
给变量赋值操作等式本身返回的也是unit 值
纯指令式风格(递归)实现 求解最大公约数
def gcd(x:Long,y:Long):Long = if (y == 0)x else gcd(y,x%y)
for
for (i <- 1 to 5) println(i) // 12345
for (i <- 1 until 5) println(i) //1234
for (i <- 1 until 5 if i > 2) println(i) //34 if 过滤
/*
i <- 1 to 5
1 to 5 是 Range 类型
i <- 1 to 5 是发生器(generator)(python叫生成器),每一次枚举,名为 i 的新的 val 就被元素值初始化。编译器能够推断出它是Int类型。
*/
for (
i <- 1 to 10
if i > 2
if i % 2 != 0
)print(i) //多个条件过滤 i>2 且 i%2 !=0 才运行此打印命令
val filesHere = (new java.io.File(".")).listFiles
def fileLines(file: java.io.File) =
scala.io.Source.fromFile(file).getLines.toList
def grep(pattern: String) = {
for(
file <- filesHere
if file.getName.endsWith(".scala")
line <- fileLines(file)
if line.trim.matches(pattern) //多层嵌套
)println(file + ":" + line.trim)
}
#类似于:
for file in filesHere:
if file.endswith(".scala"):
for line in file.readlines():
if line.strim.matches(pattern):
print (file + ":" + line.trim)
val filesHere = (new java.io.File(".")).listFiles
def fileLines(file: java.io.File) =
scala.io.Source.fromFile(file).getLines.toList
def grep(pattern: String) = {
for(
file <- filesHere
if file.getName.endsWith(".scala")
line <- fileLines(file)
//if line.trim.matches(pattern) //多次用到了 line.trim
trimmed = line.trim //流式变量 trimmed 是val 类型的,
if trimmed.matches(pattern)
)//println(file + ":" + line.trim)
println(file + ":" + trimmed)
}
val filesHere = (new java.io.File(".")).listFiles
def fileLines(file: java.io.File) =
scala.io.Source.fromFile(file).getLines.toList
def grep(pattern: String) = {
for(
file <- filesHere
if file.getName.endsWith(".scala")
line <- fileLines(file)
if line.trim.matches(pattern) //多层嵌套
) yield line.trim.length // 返回每一行去掉空格之后的长度
} // 最终返回一个数组 Array[Int]
try
使用throw
抛出异常
先创建一个异常对象,然后用throw
抛出
throw new IllegalArgumentException
var aNum = 5
if(aNum % 2 == 0)
print("haha")
else
throw new RuntimeException("anum must be even")// throw 抛出的异常类型为Nothing,因此得到的值为Nothing
var aNum = 5
try{
if(aNum % 2 == 0)
print("haha")
else
throw new RuntimeException("anum must be even")
}catch {
case ex:RuntimeException =>print("aiyou") //捕获 Run...异常,然后调用指定的函数
case ex:IllegalArgumentException => print("hehe") //如果异常不再这两个case之内,那么就会向上传导
}
try...catch...finally
def urlFor(path: String)={
try{
new URL(path)
}catch{
case e: MalformedURLException =>new URL("https://www.baidu.com")
}finally {
print("iiiii")
}
}
def f():Int = try{ return 1} finally {return 2} // 始终返回 2,其实是 2覆盖了 1
def g():Int = try{1} finally {2} //返回1
match
val aArg = "aha"
aArg match{
case "haha" =>println("right") //隐含了break
case "hehe" => println("wrong") // case 后面接的不止是Int,String类型,可以是任何类型的常量或其他东西。
case _ => println("i dont't know") // _ 占位符, 表示默认情况 _ 是常用的用来匹配未知变量的通配符。
}
val aArg = "haha"
val name =
aArg match{
case "haha" => "right" // 返回值
case "hehe" => "wrong"
case _ => "i don't know"
}
println(name)
scala 中 没有 break 和continue
变量的作用范围
大括号{}
起到引入新的作用范围的作用。大括号能起到遮蔽括号内外同名变量的作用。
因此不同于java的不能创建同名变量,scala可以在大括号内外创建同名变量。
object InBuildControl{
def main(args: Array[String]): Unit = {
val i = 10
for(z <- 1 until 2){
val i = 12
println(i) //12
}
println(i) //10
}
}
子{}
可以访问父{}
的变量
object InBuildControl{
def main(args: Array[String]): Unit = {// 祖 层开始
val i = 10
val a = 23
for(z <- 1 until 2){ //父 层开始
val i = 12 //遮蔽了祖层的同名变量 i
println(i) //12
for (j <- 1 until 2){ //子 层开始
println(i) //12 虽然祖、父层都有i,但是父层遮蔽了祖层的i,所以这里读取的是父层的i
println(a) //23 只有祖 层 才有a 所以没有所谓遮蔽
}//子层结束
}//父层结束
println(i) // 10 打印本层的 i
}//祖层结束
}
scala-- 内建控制结构的更多相关文章
- Scala学习笔记——内建控制结构
Scala的内建控制结构包括:if.while.for.try.match和函数调用 1.if表达式 //常见的写法 var filename = "name" if (!args ...
- Scala的内建控制结构
Scala中的内建控制机构仅有if.while.for.try.match和函数调用.虽然Scala的基础控制结构少,但也足以支持指令式语言里所有的实质内容.因为它们都能产生值,有助于缩短代码. 程序 ...
- Scala 编程(四)内建控制结构
if 表达式 Scala 的 if 如同许多其它语言中的一样工作.它测试一个状态并据其是否为真,执行两个分支中的一个: var filename = "default.txt" i ...
- scala编程(七)——内建控制结构
几乎所有的 Scala 的控制结构都会产生某个值.这是函数式语言所采用的方式,程序被看成是计算值的活动,因此程序的控件也应当这么做.另外,指令式语言经常具有三元操作符(如 C,C++和 Java 的? ...
- Programming In Scala笔记-第七章、Scala中的控制结构
所谓的内建控制结构是指编程语言中可以使用的一些代码控制语法,如Scala中的if, while, for, try, match, 以及函数调用等.需要注意的是,Scala几乎所有的内建控制结构都会返 ...
- Scala学习笔记(五):内建控制循环
前言 Scala中内建控制循环包括if.while.for.try.match和函数调用. if和while与java类似,不做介绍. for 基础用法 def main(args: Array[St ...
- BASH BUILTIN COMMANDS 内建命令
除非另外说明,这一章介绍的内建命令如果接受 - 引导的选项,那么它也接受 -- 作为参数,来指示选项的结束 : [arguments] 没有效果:这个命令除了扩展 arguments 并且作任何指定的 ...
- Bash shell的内建命令:type
type指令是用来观察指令时来自于外部指令还是内建在bash中的指令. type [-tpa] name 选项与参数: :不加任何选项与参数时,type会显示出name是外部指令还是bash内建指 ...
- Bash Shell内建命令和保留字
Bash Shell内建命令和保留字命令含义!保留字,逻辑非:不做任何事,只做参数展开.读取文件并在shell中执行它alias设置命令或命令行别名bg将作业置于后台运行bind将关键字序列与read ...
随机推荐
- Grid中添加链接,打开选项卡页面
如何在grid中点击,添加一个选项卡并打开页面 function addeditnew(id, title) { var node ...
- 洛谷2014选课(树型dp)
题目:https://www.luogu.org/problemnew/show/P2014 千万注意遍历 j 和 k 的边界! 0点很好用. siz很好用. #include<iostream ...
- 二分法查找 (Binary Search)
二分法查找适用于排列有序的数据.java实现方法如下: // Find the location of a value in array a // Array a must be sorted // ...
- Microsoft.Crm.Setup.SrsDataConector.RegisterServerAction 操作失败 Requested value 'Geo' was not found 的解决方法
error installing ssrs data connector on sql server for dynamics crm 2011 I think the post title says ...
- 阿里巴巴Java开发手册-并发处理
1. [强制]获取单例对象需要保证线程安全,其中的方法也要保证线程安全.说明:资源驱动类.工具类.单例工厂类都需要注意. 2. [强制]创建线程或线程池时请指定有意义的线程名称,方便出错时回溯.正例: ...
- 【python】class之super关键字的作用
在Python类的方法(method)中,要调用父类的某个方法,在Python 2.2以前,通常的写法如代码段1: 代码段1: class A: def __init__(self): prin ...
- java 装饰设计模式模式
对已有功能进行增强 示例 已有的类 调用 增强后的类 调用 思考? 为什么要这么做呢? SuperPerson 继承 Person 可以达到同样的效果. 继承的写法,其中MyBuffer... ...
- 异步FIFO格雷码与空满
在传递读写时钟域的指针使用格雷码来传递,如何把二进制转换为格雷码,格雷码是如何判断读空写满呢? 二进制码转换成二进制格雷码,其法则是保留二进制码的最高位作为格雷码的最高位,而次高位格雷码为二进制码的高 ...
- 从云端到边缘 AI推动FPGA应用拓展
近日,全球最大的FPGA厂商赛灵思宣布收购深鉴科技的消息,引发人工智能芯片行业热议,这也是首起中国AI芯片公司被收购的案例.值得注意的是,收购深鉴科技的赛灵思在2018年下半年重点发展方面是汽车自动驾 ...
- 9-16Jenkins-4节点
1.Jenkins-系统管理-全局安全配置,设置代理端口和协议类型,保存 2.Jenkins-系统管理-节点管理,建立节点 设置节点名称,节点工作目录.标签.用法.启动方式设置如下: 标签用于管理节点 ...