美文网首页Scala
Scala基础(2)- 值,变量,函数

Scala基础(2)- 值,变量,函数

作者: 彤庆 | 来源:发表于2015-03-03 04:48 被阅读657次

    声明值和变量

    值(value)声明以后不能修改其内容

    val result = 3 + 4 * 5
    
    result = 0 // error 
    

    变量(variable)声明以后可以修改其内容。

    var counter = 0
    counter = 1 // ok
    

    很C++,Java不同,Scala鼓励尽量使用val,避免副作用的发生。另外,可以看到我们没有像Java一样给result或者counter声明类型。Scala可以通过赋值推测出其类型。当然如果需要,也可以显示标明类型。

    var message: String = null
    

    函数

    简单的函数定义如下

    def max(x: Int, y: Int): Int = {
               if (x > y) x
               else y }
    

    和大多数语言不同,Scala把类型(如Int)放在了参数名后面。个人理解,这样做的原因是很多时候,返回类型是可以省略的。相比较而言,参数名更为重要,所以放在前面。这也符合写程序的思考习惯。另外,函数没有return,默认执行的最后一行就是return,这一点也印证了“表达式即值”的思想,也是REPL中每执行一行,就有个result的原因。

    如果函数不带参数,你可以不写括号。

    scala> def three() = 1 + 2
    three: ()Int
    scala> three()
    res2: Int = 3
    scala> three
    res3: Int = 3
    

    这一点也适用于类的方法。这个设计不是随意为之,在谈类和对象时再仔细讲。现在只看看下面一个例子, Scala版本的快速排序(比Java版本简洁很多)

    def sort(xs: Array[Int]): Array[Int] = {
        if (xs.length <= 1) xs
        else {
            val pivot = xs(xs.length / 2)
            Array.concat(
                sort(xs filter (pivot >)),
                xs filter (pivot ==),
                sort(xs filter (pivot <))
            )
        }
    }
    

    我们还没有介绍filter,不过可以想象xs filter (pivot >) 部分从xs中就是得到大于pivot的数列。想象xs filter someting就相当于xs.filter(something)。同理,x > y就是x.>(y)。而pivot >就相当于pivot.>()。一个缺省参数简化编程表达的应用。

    函数的参数

    参数可以是可变长的。

     scala> def echo(args: String*) =
                     for (arg <- args) println(arg)
            echo: (args: String*)Unit
    

    参数可以给与名字

    def speed(distance: Float, time: Float): Float = distance / time 
    

    使用参数名调用,可以不考虑参数顺序

     speed(time = 10, distance = 100)
    

    参数可以有默认值。这个例子默认打印到Console

     def printTime(out: java.io.PrintStream = Console.out) =
              out.println("time = "+ System.currentTimeMillis())
    

    相关文章

      网友评论

        本文标题:Scala基础(2)- 值,变量,函数

        本文链接:https://www.haomeiwen.com/subject/nhrmxttx.html