码迷,mamicode.com
首页 > 其他好文 > 详细

Scala2.11.7学习笔记(四)

时间:2015-09-28 19:19:30      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:scala

欢迎访问:鲁春利的工作笔记,学习是一种信仰,让时间考验坚持的力量。



简单的类定义

class CheckSumAccumulator {
    private var sum = 0;
    def add (b : Byte) : Unit = sum += b;
    def checksum () : Int = ~ (sum & 0xFF) + 1;
}

    Scala中class的缺省修饰符为public(public,protected,private),类的方法以def定义开始,要注意的是Scala方法的参数都是val类型,而不是var类型,因此在函数体内不可以修改参数的值。

    类的方法分两种,一种是有返回值的,一种是不含返回值的。不需要返回值的方法,Scala内部其实将这种函数的返回值定为Unit(类同Java的void类型),但可以省略掉“=”号。

    Scala代码无需使用“;”结尾,也不需要使用return来返回值,函数最后一行的值就作为函数的返回值。

    在Scala中使用object关键字定义Singleton(单例)对象,除此之外与类定义非常类似。

import scala.collection.mutable.Map;

object CheckSumAccumulator {
    private val cache = Map[String, Int]();
    def calculate (str : String) : Int = {
        if (cache.contains(str)) {
            cache (str);
        } else {
            val acc = new CheckSumAccumulator;
            for (c <- str) {
                acc.add(c.toByte);
            }
            val cs = acc.checksum();
            cache += (str -> cs);      // 需要指定引用的是mutable的包,否则提示错误
            cs;
        }
    };
}

    伴侣对象:

import scala.collection.mutable.Map

/**
 * printargs.scala文件代码
 * @author lucl
 */
class CheckSumAccumulator {
    private var sum = 0;
    def add(b: Byte): Unit = sum += b;
    def checksum(): Int = ~(sum & 0xFF) + 1;
    def main(args: Array[String]): Unit = {
        println("Hello : CheckSum.");
    }
}

object CheckSumAccumulator {
    private val cache = Map[String, Int]();
    def calculate(str: String): Int = {
        println("receive str is : " + str);
        if (cache.contains(str)) {
            cache(str);
        } else {
            val acc = new CheckSumAccumulator;
            for( c <- str) {
                println("iterator str print item : " + c);
                acc.add(c.toByte);
            }
            val cs=acc.checksum()
            cache += ( str -> cs)
            cs;
        }
    };
}

println(CheckSumAccumulator.calculate("Welcome to Scala Chinese community"));

    该对象与上面的类同名,在Scala中把这个对象称为其同名的类的“伴侣”对象(Companion object)。如果你需要定义的类的companion对象,Scala要求这两个定义需放在同一个文件中。类和其companion对象可以互相访问对方的私有成员。

G:\Hadoop\scala-SDK\source>scala printargs.scala
receive str is : Welcome to Scala Chinese community
iterator str print item : W
iterator str print item : e
iterator str print item : l
// 略
iterator str print item : n
iterator str print item : i
iterator str print item : t
iterator str print item : y
-183

    Scala中仅仅定义Singleton对象本身不会创建一个新的类型,也不可以使用new再创建一个新的Singleton对象,此外和类定义不同的是,singleton对象不可以带参数。

    来看看我们的第一个例子”Hello World“:

object HelloWorld {
    def main(args : Array[String]) {
        println("Hello World!");
    }
}

    这是一个最简单的Scala程序,HelloWorld 是一个Singleton对象,它包含一个main方法(可以支持命令行参数),和Java类似,Scala中任何Singleton对象,如果包含main方法,都可以作为应用的入口点
    注意,在Scala中不要求public类定义和其文件名同名,不过使用和public类和文件同名还是有它的优点的,可以根据个人喜好决定是否遵循Java文件命名风格。

    最后提一下Scala的trait功能,Scala的trait 和Java 的Interface相比,可以有方法的实现。Scala的Trait支持类和Singleton对象和多个Trait混合(使用来自这些Trait中的方法,而不时不违反单一继承的原则)。

    Scala为Singleton对象的main定义了一个App trait类型,因此上面的例子可以简化为:

HelloWorld.scala
object HelloWorld extends App {
    println("Hello World!");
}

    这段代码就不能作为脚本运行,Scala的脚本要求代码最后以表达式结束。因此运行这段代码,需要先编译这段代码,然后再运行。

// 第一次直接运行,无任何输出    
G:\Hadoop\scala-SDK\source>scala HelloWorld.scala

// 进行编译
G:\Hadoop\scala-SDK\source>scalac HelloWorld.scala
// 再次运行
G:\Hadoop\scala-SDK\source>scala HelloWorld
Hello World!

    注意: Scala提供了一个快速编译代码的辅助命令fsc (fast scala compliler) ,使用这个命令,只在第一次使用fsc时启动JVM,之后fsc在后台运行,这样就避免每次使用scalac时都要载入相关库文件,从而提高编译速度。

本文出自 “鲁春利的工作笔记” 博客,请务必保留此出处http://luchunli.blog.51cto.com/2368057/1698773

Scala2.11.7学习笔记(四)

标签:scala

原文地址:http://luchunli.blog.51cto.com/2368057/1698773

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!