Scala2.11.7学习笔记(四)

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



简单的类定义

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时都要载入相关库文件,从而提高编译速度。

时间: 2024-10-12 09:13:35

Scala2.11.7学习笔记(四)的相关文章

Scala2.11.7学习笔记API说明

欢迎访问:鲁春利的工作笔记,学习是一种信仰,让时间考验坚持的力量. Scala Standard Library 2.11.7 This is the documentation for the Scala standard library. Package structure The scala package contains core types like Int, Float, Arrayor Option which are accessible in all Scala compil

Scala2.11.7学习笔记汇总

欢迎访问:鲁春利的工作笔记,学习是一种信仰,让时间考验坚持的力量. 本文出自 "闷葫芦的世界" 博客,请务必保留此出处http://luchunli.blog.51cto.com/2368057/1715754

Scala2.11.7学习笔记(七)Scala包介绍

欢迎访问:鲁春利的工作笔记,学习是一种信仰,让时间考验坚持的力量. 本文出自 "鲁春利的工作笔记" 博客,请务必保留此出处http://luchunli.blog.51cto.com/2368057/1705420

Scala2.11.7学习笔记(八)private修饰符说明

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

Scala2.11.7学习笔记(六)文件操作

欢迎访问:鲁春利的工作笔记,学习是一种信仰,让时间考验坚持的力量. 1.读取文件 import scala.io.Source; if (args.length > 0) {     for (line <- Source.fromFile(args(0)).getLines()) {         println(line.length + "\t" + line);     } } else {     Console.err.println("Please

Scala2.11.7学习笔记(七)类和对象

鲁春利的工作笔记,好记性不如烂笔头 apply 需要构造有参数需求的伴生对象时,可定义并使用apply方法. class HelloWorld (var m : String, var n : Char) {     println("I'm class HelloWorld!");     def speak () {         println("Class HelloWorld Speak.");     } } object HelloWorld {  

Scala2.11.7学习笔记(一)

环境准备 基础入门

Scala2.11.7学习笔记(六)Scala特质介绍

特质 Scala的trait 和Java 的Interface相比,可以有方法的实现.Scala的Trait支持类和Singleton对象和多个Trait混合(使用来自这些Trait中的 方法,而不时不违反单一继承的原则). Scala为Singleton对象的main定义了一个App trait类型,因此上面的例子可以简化为: HelloWorld.scala object HelloWorld extends App {     println("Hello World!"); }

Boost Thread学习笔记四

barrierbarrier类的接口定义如下: 1 class barrier : private boost::noncopyable   // Exposition only 2 { 3 public: 4   // construct/copy/destruct 5   barrier(size_t n); 6   ~barrier(); 7  8   // waiting 9   bool wait();10 }; barrier类为我们提供了这样一种控制线程同步的机制:前n - 1次调