• Scala第三章学习笔记


    换行后的左大括号造成的问题:

    class FooHolder
    {
        def foo()
        {
            println("foo was called")
        }
    }

    Scala认为def foo()这行代码定义了一个抽象方法。这是因为它没有捕捉到后面的大括号,认定def foo()是完整的一行语句。当编译时,它认为这是一个洗呢匿名代码块,应该在类构建过程中执行。

    解决办法:加一条新的编码规定,要求所有的方法定义使用"="语法。

    trait FooHolder2{
        def foo() : Unit = 
        {
            println("foo2 was called")
        }
    }

     空悬的操作符和括号表达式

    "大字符串聚合"是空悬操作符能够帮到编译器的例子,指你试图创建一个很大的、无法在一行里完整定义的字符串。

    java例子:

    class test{
        private int x = 5;
        private String foo() {
            return "HAI"
                + x
                + "ZOMG"
                + "
    ";
            }
    }

    在Scala下就会编译失败,可以把操作符放到行末,从而知道后面还有更多内容

    class test{
        private int x = 5;
        private String foo() {
            return "HAI" +
                 x +
               "ZOMG" +
               "
    ";
            }
    }

    也可以增加括号

    class test{
        private int x = 5;
        private String foo() {
            return ("HAI"
                + x
                + "ZOMG"
                + "
    ";)
            }

     Scala的特质是线性化的,所以如果想要使用覆盖的方法,可以在实例化对象的时候混入父类,而不需要定义新的类。

    trait Animal {def talk : String}
    trait Mammal extends Animal
    trait Cat {def talk = "Meow"}
    
    val x = new Mammal with Cat 
    
    x.talk

    执行结果如下:

    注解优化 @tailrec @switch注解

    使用@switch注解

    编译器给出了警告语句。因为模式匹配无法优化,编译不过。

    @tailre 注解用于确保可以对方法执行尾递归优化,是把最后一句语句调用自身的函数转换为不占用栈控件,而是类似传统的while或for循环那样执行。JVM本身不支持,所以依赖于Scala编译器来执行优化。

    要优化尾递归调用,Scala编译器需要以下条件。

    (1)方法必须是final或私有。方法不能多态。

    (2)方法必须注明返回类型。

    (3)方法必须在其某个分支的最后一句调用自身。

    广度优先搜索算法是搜索图或树的一种算法:先检查顶层元素,然后是这些元素的最近邻居,然后是最近邻居的最近邻居,据此类推,直到找到你想要的元素。

    def search(start : Node, p : Node => Boolean) = {
        @tailrec
        def loop(nodeQueue : List[Node],visited : Set[Node]) : Option[Node] =
        nodeQueue match{
            case head :: tail if p(head) =>
            some(head)
            case head :: tail if !visited.contains(head) =>
                loop(tail ++ head.edges, visited + head)
            case head :: tail ==> 
            loop(tail,visited)
            case head Nil => 
            None
         }
       loop(List(start),Set())
    }
  • 相关阅读:
    跨域上传文件
    算法
    websocket
    Bottle
    爬虫一
    RabbitMQ
    git&github快速入门
    centos6安装SaltStack
    ajax
    Django之Model操作
  • 原文地址:https://www.cnblogs.com/yangsy0915/p/4942023.html
Copyright © 2020-2023  润新知