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 ...
随机推荐
- jQuery如何取得HiddenField值(转)
<f:HiddenField runat="server" ID="cat_id" Text="ssss"/> var strD ...
- sublime text3安装 mac os汉化/常用模块
sublime text介绍: Sublime Text 是一个代码编辑器(Sublime Text 2是收费软件,但可以无限期试用),也是HTML和散文先进的文本编辑器.Sublime Text是由 ...
- django orm 常用查询筛选
大于.大于等于 __gt 大于 __gte 大于等于 User.objects.filter(age__gt=10) // 查询年龄大于10岁的用户 User.objects.filter(age__ ...
- [转]Java. SqlServer 使用
public void add(Emp emp) throws Exception { String connectionUrl = "jdbc:sqlserver://localhost: ...
- [UE4]蓝图函数库小结
蓝图函数库的功能非常强劲,如果在项目中使用的话有时能达到事半功倍的效果. 蓝图函数库,Blueprint Function Library.可以非常方便的将代码中的函数暴露给所有的蓝图使用,同时也提供 ...
- (转)linux查找技巧: find grep xargs
在当前目录下所有.cpp文件中查找efg函数 find . -name "*.cpp" | xargs grep 'efg' xargs展开find获得的结果,使其作为grep的参 ...
- 理解 tornado.gen
转自:http://blog.xiaogaozi.org/2012/09/21/understanding-tornado-dot-gen/ 理解 tornado.gen SEP 21ST, 2012 ...
- unity3d的碰撞检测及trigger
A.基本概念 要产生碰撞必须为游戏对象添加刚体(Rigidbody)和碰撞器,刚体可以让物体在物理影响下运动.碰撞体是物理组件的一类,它要与刚体一起添加到游戏对象上才能触发碰撞.如果两个刚体相互撞在一 ...
- Github提交Spark代码
记录下提交过程,易忘供查询用.内容源自田总的分享. 1)在github上fork一份最新的master代码 2)用社区代码库创建本地仓库 git clone https://github.com/ap ...
- Django中间件执行流程
中间件函数是 django 框架为我们预留的函数接口, 让我们可以干预请求和应答的过程 1. 获取浏览器端的IP地址: 使用 request.META[‘REMOTE_ADDR’] 2. 使用中间件 ...