内建控制结构

​ 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-- 内建控制结构的更多相关文章

  1. Scala学习笔记——内建控制结构

    Scala的内建控制结构包括:if.while.for.try.match和函数调用 1.if表达式 //常见的写法 var filename = "name" if (!args ...

  2. Scala的内建控制结构

    Scala中的内建控制机构仅有if.while.for.try.match和函数调用.虽然Scala的基础控制结构少,但也足以支持指令式语言里所有的实质内容.因为它们都能产生值,有助于缩短代码. 程序 ...

  3. Scala 编程(四)内建控制结构

    if 表达式 Scala 的 if 如同许多其它语言中的一样工作.它测试一个状态并据其是否为真,执行两个分支中的一个: var filename = "default.txt" i ...

  4. scala编程(七)——内建控制结构

    几乎所有的 Scala 的控制结构都会产生某个值.这是函数式语言所采用的方式,程序被看成是计算值的活动,因此程序的控件也应当这么做.另外,指令式语言经常具有三元操作符(如 C,C++和 Java 的? ...

  5. Programming In Scala笔记-第七章、Scala中的控制结构

    所谓的内建控制结构是指编程语言中可以使用的一些代码控制语法,如Scala中的if, while, for, try, match, 以及函数调用等.需要注意的是,Scala几乎所有的内建控制结构都会返 ...

  6. Scala学习笔记(五):内建控制循环

    前言 Scala中内建控制循环包括if.while.for.try.match和函数调用. if和while与java类似,不做介绍. for 基础用法 def main(args: Array[St ...

  7. BASH BUILTIN COMMANDS 内建命令

    除非另外说明,这一章介绍的内建命令如果接受 - 引导的选项,那么它也接受 -- 作为参数,来指示选项的结束 : [arguments] 没有效果:这个命令除了扩展 arguments 并且作任何指定的 ...

  8. Bash shell的内建命令:type

    type指令是用来观察指令时来自于外部指令还是内建在bash中的指令. type  [-tpa]  name 选项与参数: :不加任何选项与参数时,type会显示出name是外部指令还是bash内建指 ...

  9. Bash Shell内建命令和保留字

    Bash Shell内建命令和保留字命令含义!保留字,逻辑非:不做任何事,只做参数展开.读取文件并在shell中执行它alias设置命令或命令行别名bg将作业置于后台运行bind将关键字序列与read ...

随机推荐

  1. Excel的方向键失灵

    Excel的方向键操作不再是sheet范围内转动:而是变成了整个sheet页面在跳动. 不只是Excel,viso也是如此. 这是因为你的Scroll Lock键被按下了:所致箭头被解读为页面滚轮在滑 ...

  2. 组件之间的通讯:vuex状态管理,state,getters,mutations,actons的简单使用(一)

    之前的文章中讲过,组件之间的通讯我们可以用$children.$parent.$refs.props.data... 但问题来了,假如项目特别大,组件之间的通讯可能会变得十分复杂... 这个时候了我们 ...

  3. net.sf.ezmorph.bean.MorphDynaBean cannot be cast to java.util.Map

    public static void main(String[] arg0) { String reString = "{" + "\"code\": ...

  4. Nginx+tomcat+redis实现session共享

    Nginx+tomcat+redis实现session共享 1,安装nginx,使用yum -y install nginx 这是epel源中的,需要安装epel源. 2,配置nginx. 在ngin ...

  5. 小峰mybatis(5)mybatis使用注解配置sql映射器--动态sql

    一.使用注解配置映射器 动态sql: 用的并不是很多,了解下: Student.java 实体bean: package com.cy.model; public class Student{ pri ...

  6. 关于DELL服务器如果采购散件,进行服务器升级的相关说明

    拿DELL服务器内存来说明这个情况,其他硬盘等等是 一样的: 1.DELL服务器的内存散件,从购买之日起,质保期是一年: 2.但是如果你把内存插到能兼容这个内存的服务器上去使用,请注意我的字眼,是能兼 ...

  7. innerHTML与jquery里的html()区别介绍

    我原本一直以为innerHTML和jquery里的html其实是完全一样的,jquery是多此一举了,直到我遇到一次问题   看个示例: 复制代码 代码如下: var tbody=document.c ...

  8. 深入理解yield(二):yield与协程

    转自:http://blog.beginman.cn/blog/133/ 协程概念 1.并发编程的种类:多进程,多线程,异步,协程 2.进程,线程,协程的概念区别: 进程.线程和协程的理解 进程:拥有 ...

  9. Delphi Webbrowser使用方法详解(二)

    delphi如何用webbrowser模拟登录网站? 我们就以如何登录博客园来做示例: 1.要登入一个网站,首先要获取网页的源代码,我们可以通过网页菜单--查看--查看源代码来获取. 2.我们找到登录 ...

  10. sqoop操作之ORACLE导入到HIVE

    导入表的所有字段 sqoop import --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \ --username SCOTT --passw ...