`
fineqtbull
  • 浏览: 51428 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

Scala学习笔记(Scala编程第18章 Stateful Objects 例子分析)

阅读更多
《Programming In Scala》第18章 Stateful Objects 例子分析。

源程序:
/**
 * 《Programming In Scala》第18章 Stateful Objects 例子
 */
package org.stairwaybook.simulation

//模拟器基类
abstract class Simulation {
    //模拟动作,为函数
    type Action = () => Unit
    //工作项目,time为动作启动时间,action为动作
    case class WorkItem(time: Int, action: Action)
    //当前时间
    private var curtime = 0
    //取得当前时间
    def currentTime: Int = curtime
    //工作日程表,例表内项目应按照启动时间的升序排列
    private var agenda: List[WorkItem] = List()
    //向日程表中加入工作项目,ag为目标日程表,item为被插入项目
    private def insert(ag: List[WorkItem],  item: WorkItem): List[WorkItem] = {
        //按升序插入
        if (ag.isEmpty || item.time < ag.head.time) item :: ag
        //分割列表,递归调用找到第一个比被插入项目晚的项目
        else ag.head :: insert(ag.tail, item)
    }
    //向内部日程表中插入指定延时后的工作,delay为延时时间,block为工作函数(by name)
    def afterDelay(delay: Int)(block: => Unit) {
        val item = WorkItem(currentTime + delay, () => block)
        agenda = insert(agenda, item)
    }
    //取得日程表中最前面的工作,并将其从日程表中删除,然后执行该工作
    private def next() {
        (agenda: @unchecked) match {
            case item :: rest =>
                agenda = rest
                curtime = item.time
                item.action()
        }
    }

    //执行模拟
    def run() {
        //打印开始时间
        afterDelay(0) {
            println("*** simulation started, time = " + currentTime + " ***")
        }
        //执行日程表中所有工作
        while (!agenda.isEmpty) next()
    }
}

//电路模拟基类
abstract class BasicCircuitSimulation extends Simulation {
    //反转器延时
    def InverterDelay: Int
    //结合器延时
    def AndGateDelay: Int
    //分离器延时
    def OrGateDelay: Int
    //线路类
    class Wire {
        //线路值(状态)
        private var sigVal = false
        //执行动作
        private var actions: List[Action] = List()
        //取得线路值
        def getSignal = sigVal
        //设置线路值,当值有变化就执行所有动作
        def setSignal(s: Boolean) =
            if (s != sigVal) {
                sigVal = s
                actions foreach (_ ())
            }
        //加入动作,并且执行一次该动作
        def addAction(a: Action) = {
            actions = a :: actions
            a()
        }
    }
    //加入反转工作
    def inverter(input: Wire, output: Wire) = {
        def invertAction() {
            val inputSig = input.getSignal
            afterDelay(InverterDelay) {
                output setSignal !inputSig
            }
        }
        //invertAction加入后马上被执行,并且在input的每次状态改变后都会被执行
        input addAction invertAction
    }
    //加入结合工作
    def andGate(a1: Wire, a2: Wire, output: Wire) = {
        def andAction() = {
            val a1Sig = a1.getSignal
            val a2Sig = a2.getSignal
            afterDelay(AndGateDelay) {
                output setSignal (a1Sig & a2Sig)
            }
        }
        //addAction加入后马上被执行,并且在a1或a2中的任意一个状态改变后就会被执行
        a1 addAction andAction
        a2 addAction andAction
    }
    //加入分离工作
    def orGate(o1: Wire, o2: Wire, output: Wire) {
        def orAction() {
            val o1Sig = o1.getSignal
            val o2Sig = o2.getSignal
            afterDelay(OrGateDelay) {
                output setSignal (o1Sig | o2Sig)
            }
        }
        //orAction加入后马上被执行,并且在o1或o2中的任意一个状态改变后就会被执行
        o1 addAction orAction
        o2 addAction orAction
    }
    //线路监测工作
    def probe(name: String, wire: Wire) {
        def probeAction() {
            println(name +" "+ currentTime + " newvalue = " + wire.getSignal)
        }
        //加入后马上被执行,并且在wire的每次状态改变后都会被执行
        wire addAction probeAction
    }
}

//扩展电路模拟类
abstract class CircuitSimulation
extends BasicCircuitSimulation {
    //加入半加工作
    def halfAdder(a: Wire, b: Wire, s: Wire, c: Wire) {
        val d, e = new Wire
        orGate(a, b, d)
        andGate(a, b, c)
        inverter(c, e)
        andGate(d, e, s)
    }
    //加入全加工作
    def fullAdder(a: Wire, b: Wire, cin: Wire, sum: Wire, cout: Wire) {
        val s, c1, c2 = new Wire
        halfAdder(a, cin, s, c1)
        halfAdder(b, s, sum, c2)
        orGate(c1, c2, cout)
    }
}

//文件主单例对象,作为本文件的主执行程序
object App extends Application {
    //模拟对象实例
    object MySimulation extends CircuitSimulation {
        def InverterDelay = 1
        def AndGateDelay = 3
        def OrGateDelay = 5
    }
    //引入模拟对象实例中的所有元素
    import MySimulation._
    //定义线路
    val input1, input2, sum, carry = new Wire
    //加入监测点
    probe("sum", sum)
    probe("carry", carry)
    //加入半加
    halfAdder(input1, input2, sum, carry)
    //改变input1的状态
    input1 setSignal true
    //执行模拟
    run()

    //改变input2的状态
    input2 setSignal true
    //执行模拟
    run()
}


执行结果:
sum 0 newvalue = false
carry 0 newvalue = false
*** simulation started, time = 0 ***
sum 8 newvalue = true
*** simulation started, time = 8 ***
carry 11 newvalue = true
sum 15 newvalue = false
分享到:
评论
2 楼 fineqtbull 2009-10-05  
scanfprintf123 写道
我觉得你可以总结下你学习 scala的经验 哪些需要注意 哪些需要避免 读者一般都希望能够通过你写的BLOG获得一定的经验 这样才是交流的目的

同意你的意见。我们办了一个Scala圈子,主要是提供Scala资料和交流学习经验的,欢迎来看一看 。连接是http://scalagroup.group.iteye.com/。另外我翻译的Scala讲座,挺适合初学者的,连接是http://scalagroup.group.iteye.com/group/blog/480538
1 楼 scanfprintf123 2009-10-05  
我觉得你可以总结下你学习 scala的经验 哪些需要注意 哪些需要避免 读者一般都希望能够通过你写的BLOG获得一定的经验 这样才是交流的目的

相关推荐

    Scala学习笔记,大全笔记

    Scala学习笔记,大全笔记

    Scala学习笔记(全)

    ### Scala学习笔记(全) #### 一、Scala概述与特点 Scala是一种多范式的编程语言,旨在集成面向对象编程和函数式编程的各种特性。它运行于Java平台(Java虚拟机JVM),并且能够完全兼容所有的Java程序。这使得Scala...

    scala学习笔记整理

    在"scala学习笔记整理"中,我们可以深入探讨以下关键知识点: 1. **基础语法**:Scala的基础语法与Java有相似之处,但也有很多独特的特点。例如,它支持变量的不可变性(immutability),使用`val`声明常量,`var`...

    scala编程中文pdf

    scala编程 33章 中文pdf Scala编程实战 目录 第1章字符串. 11 第2章数值39 第3章控制结构.60 第4章类和属性.103 第5章方法147 第6章对象170 第7章包和导入.190 第8章特质200 第9章函数式编程214 第10 章集合242 第...

    Scala学习笔记

    ### Scala学习笔记关键知识点 ...以上内容涵盖了Scala学习笔记中的关键知识点,从并发编程到函数式编程的核心概念,再到Scala语言本身的一些特殊规则和特点,这些都是学习Scala时需要掌握的基础知识。

    Scala编程 pdf

    Scala编程是一种多范式、函数式和面向对象的编程语言,设计目的是为了提高开发者的生产力,同时保持代码的可维护性和高性能。它是由Martin Odersky在2003年设计并实现的,融合了Java虚拟机(JVM)的优势,并引入了...

    快学Scala完整版&Scala编程(中文版)&Scala程序设计-多线程编程实践

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,使得它在处理并发和大数据分析方面尤为出色。这个压缩包包含了三本关于Scala学习的重要资源,分别是《快学Scala》完整版书籍、《SCALA程序...

    Scala和Spark大数据分析函数式编程、数据流和机器学习

    Scala是一种静态类型的函数式编程语言,而Spark是一个分布式计算框架,尤其适合于大数据处理和分析。本教程将深入探讨这两者如何结合,实现高效的大数据分析、数据流处理以及机器学习任务。 首先,让我们来理解...

    [Scala学习笔记-中文资料]从java角度看Scala

    [Scala学习笔记-中文资料] 从java角度看Scala

    Scala函数式编程

    《Scala函数式编程》是针对希望学习FP并将它应用于日常编码中的程序员而写的,内容包括:函数式编程的概念;函数式编程相关的各种“为什么”和“怎么做”;如何编写多核程序;练习和检测。 从OOP到FP,思路的转化 ...

    scala学习笔记1

    ScalaOverview.pdf ScalaTutorial.pdf ProgrammingInScala.pdf(这本是书) 博文链接:https://dogstar.iteye.com/blog/182673

    scala学习资料

    Scala是一种强大的、现代的编程语言,它融合了面向对象编程(OOP)和函数式编程(FP)的特性,为开发者提供了丰富的表达能力和高效的代码执行环境。作为Java平台上的一个成员,Scala程序可以在Java虚拟机(JVM)上...

    最好的scala学习 课件

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,被广泛应用于大数据处理...通过深入学习和实践,你不仅可以掌握Scala语言,还能有效利用Scala在大数据分析和处理项目中发挥出Spark的强大性能。

    读书笔记:scala 编程代码实际例子.zip

    读书笔记:scala 编程代码实际例子

    尚硅谷_韩顺平_Scala语言核心编程_PDF密码解除1

    《Scala语言核心编程》是尚硅谷教育机构韩顺平老师主讲的一门课程,主要针对Scala这门多范式编程语言进行深入讲解。Scala是一种静态类型的编程语言,它融合了面向对象和函数式编程的概念,设计目标是提供一种简洁、...

    Spark技术实战之基础篇 -Scala语言从入门到精通 Scala编程详解 含课件和资料 共21个章节.rar

    Scala编程:面向对象编程之对象第14讲-Scala编程:面向对象编程之继承第15讲-Scala编程:面向对象编程之Trait第16讲-Scala编程:函数式编程第17讲-Scala编程:函数式编程之集合操作第18讲-Scala编程:模式匹配第19讲...

    scala讲解笔记 入门及进阶 PDF文档1-5

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,被广泛应用于大数据处理、分布式计算和高性能应用开发。本压缩包包含五份PDF文档,旨在帮助初学者快速入门并逐步进阶Scala编程。 第一部分...

Global site tag (gtag.js) - Google Analytics