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

Scala学习笔记(Scala编程第10章 Composition and Inheritance 例子)

阅读更多
《Programming In Scala》第10章 Composition and Inheritance 例子。

源代码:
/**
 * 《Programming In Scala》第10章 Composition and Inheritance 例子
 */
package layout

//工厂单例对象
object Element {
    //数组元素,内容为多行
    private class ArrayElement(
        val contents: Array[String]
    ) extends Element
    //行元素,内容为单行
    private class LineElement(s: String) extends Element {
        val contents = Array(s)
        override def width = s.length
        override def height = 1
    }
    //单一字符重复填充元素,填充成指定长和宽的元素
    private class UniformElement(
        ch: Char,
        override val width: Int,
        override val height: Int
    ) extends Element {
        private val line = ch.toString * width
        def contents = Array.make(height, line)
    }
    //工厂方法,创建多行元素
    def elem(contents: Array[String]): Element =
        new ArrayElement(contents)
    //工厂方法,创建单字填充元素
    def elem(chr: Char, width: Int, height: Int): Element =
        new UniformElement(chr, width, height)
    //工厂方法,创建单行元素
    def elem(line: String): Element =
        new LineElement(line)
}

//引入所有工厂方法
import Element.elem

//图形元素基类
abstract class Element {
    //元素内容
    def contents: Array[String]
    //元素宽度(字符数)
    def width: Int = contents(0).length
    //元素高度(字符数)
    def height: Int = contents.length
    //将自己放在that上面
    def above(that: Element): Element = {
        val this1 = this widen that.width
        val that1 = that widen this.width
        elem(this1.contents ++ that1.contents)
    }
    //将自己放在that的左边
    def beside(that: Element): Element = {
        val this1 = this heighten that.height
        val that1 = that heighten this.height
        elem(
            for ((line1, line2) <- this1.contents zip that1.contents)
            yield line1 + line2)
    }
    //扩充宽度,两边用空格填充
    def widen(w: Int): Element =
        if (w <= width) this
        else {
            val left = elem(' ', (w - width) / 2, height)
            var right = elem(' ', w - width - left.width, height)
            left beside this beside right
        }
    //扩充高度,上下用空格填充
    def heighten(h: Int): Element =
        if (h <= height) this
        else {
            val top = elem(' ', width, (h - height) / 2)
            var bot = elem(' ', width, h - height - top.height)
            top above this above bot
        }

    //返回该元素的文本描述。
    //内容数组中的每个元素都是一行。
    override def toString = contents mkString "\n"
}

//主单例对象,包括文件主函数
object Spiral {
    //空格元素
    val space = elem(" ")
    //转角元素
    val corner = elem("+")
    //构建螺旋图形,nEdges为构成螺旋的边数,direction为螺旋最后一条边的方向
    def spiral(nEdges: Int, direction: Int): Element = {
        //螺旋最内部元素
        if (nEdges == 1)
            elem("+")
        else {
            //递归调用,边数逐次减一
            val sp = spiral(nEdges - 1, (direction + 3) % 4)
            //竖行
            def verticalBar = elem('|', 1, sp.height)
            //横行
            def horizontalBar = elem('-', sp.width, 1)
            //上
            if (direction == 0)
                (corner beside horizontalBar) above (sp beside space)
            //右
            else if (direction == 1)
                (sp above space) beside (corner above verticalBar)
            //下
            else if (direction == 2)
                (space beside sp) above (horizontalBar beside corner)
            //左
            else
                (verticalBar above corner) beside (space above sp)
        }
    }

    def main(args: Array[String]) {
        //打印n边螺旋
        val nSides = 6
        println(spiral(nSides, 0))
    }
}



执行结果:

+-----
|     
| +-+ 
| + | 
|   | 
+---+ 
1
0
分享到:
评论

相关推荐

    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编程 pdf

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

    Scala学习笔记

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

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

    这个压缩包包含了三本关于Scala学习的重要资源,分别是《快学Scala》完整版书籍、《SCALA程序设计-JAVA虚拟机多核编程实战》以及《Scala编程》的中文版。 《快学Scala》完整版书籍是为初学者准备的一份详尽指南,...

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

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

    scala学习笔记1

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

    Scala函数式编程

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

    scala学习资料

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

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

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

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

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

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

    函数入门之变长参数第8讲-Scala编程:函数入门之过程、lazy值和异常第9讲-Scala编程:数组操作之Array、ArrayBuffer以及遍历数组第10讲-Scala编程:数组操作之数组转换第11讲-Scala编程:Map与Tuple第12讲-Scala编程...

    Scala编程例子

    通过"Scala编程例子"的学习,初学者可以逐步了解并掌握这些概念,从而在实践中运用Scala的强大功能。压缩包中的"examples"可能包含各种示例代码,涵盖以上提到的知识点,帮助学习者加深理解和应用。

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

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

    最好的scala学习 课件

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,被广泛应用于大数据处理领域,特别是与Apache Spark相结合时。本课件是针对Scala学习者精心准备的资源,旨在帮助你深入理解和掌握Scala的...

Global site tag (gtag.js) - Google Analytics