Scala基础入门(十三 ) 类、函数参数形式、种类、使用方式总结

2023-05-04 21:33:41 浏览数 (2)

类参数

在创建类的对象时,有时候是需要通过传递某些信息进行初始化的,此时可以使用类参数。类参数看起来跟方法参数列表一样,但它是位于类名的后面,类似于其他高级语言的构造器(构造函数)。 我们定义了类ClassArg并制定了一个参数,使用new关键字创建对象时,需要指定参数a,我们还可以看到 val ca = new ClassArg(10); 会执行类体的打印语句,即使它在f()方法之前,这涉及到Scala 类的初始化过程:看似在f()之前执行;但其实类的所有的定义(值、方法)会在类体执行前初始化,也就是f()方法是先于打印语句初始化的。

如果使用 ca.a; 则会提示编译错误,因为a是在类ClassArg之外不可见的参数;如果要想类参数在类之外可见,可以使用 var、val修饰。 我们给处了示例类ClassArg2,通过ca2.a是可以获取参数a的值的。

在Scala常量、变量 一节中我们已经知道 val修饰的是不可变量,但是下面这段代码确实可运行的:

val ca2 = new ClassArg2(10) println(ca2.a) ca2.a = 17;

我们可以修改ca2的a值,这好比 ca2是我们的房子,a是里面的电视机(因为是var修饰的),我们虽然不可以变更房子,但是可以替换电视机。

可变类参数

有时候我们想使用更多的类参数来定义类,那么可以使用 可变元参数列表 来支持任意数量的参数,方法是在末尾加上一个 * 。

以下是关于Scala类参数的一个完整实例程序,

代码语言:javascript复制
package com.byron4j.scala.basic


/**
 * 类参数
 */
object ClassArgDemo {

  def main(args: Array[String]): Unit = {
    val ca = new ClassArg(10);
    //提示a不是类ClassArg的成员变量
    //ca.a;

    val ca2 = new ClassArg2(10)
    println(ca2.a)
    ca2.a = 17;
    //ca2被定义成了val,但是可以更改其成员变量的值,只要不是直接修改ca2引用。
    println(ca2.a)
    //ca2 = new ClassArg2(10) //ERROR:重新赋值


    new ClassArg3(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

  }

}


//a 在类的外面是不可见的
class ClassArg(a: Int){
  //看似在f()之前执行;但其实类的所有的定义(值、方法)会在类体执行前初始化,也就是f()方法是先于打印语句初始化的
  println( f() )

  def f(): Int = { a * 10 }

}

//要想使a在类外面可见,可以使用var、val修饰
class ClassArg2(var a: Int){
  //看似在f()之前执行;但其实类的所有的定义(值、方法)会在类体执行前初始化,也就是f()方法是先于打印语句初始化的
  println( f() )

  def f(): Int = { a * 10 }

}



class ClassArg3(a: Int *){
  println("ClassArg3.result() = "   result())
  def result(): Int = {
    var sum = 0;
    for( ele <- a ){
      sum  = ele
    }
    sum
  }

}

可以尝试运行输出结果:

100 100 10 17 ClassArg3.result() = 55

具名参数、可变参数

具名参数

具名参数 即在参数列表中指定名字的参数,创建具有参数列表的类的实例时,可以指定参数的名字;调用函数时同样可以指定参数名。

具名参数 对于提高代码的阅读性比较有用,尤其是长且复杂的参数列表。 具名参数显得很清楚的话,读者甚至无需再查阅文档。

代码语言:javascript复制
package com.byron4j.scala.basic

object NamedArgDemo {
  def main(args: Array[String]): Unit = {

    // 具名参数实例 satrt...
    new Color(80, 9, 100);
      // 创建具有参数列表的类实例时,可以指定参数名字
    new Color(red = 80, blue = 9, green = 100);
    // 具名参数实例 end.


    render(red = 1, blue = 2, green = 3);



  }

  def  render(red: Int, blue: Int, green: Int): Unit= {
    println("red="   red   ", blue="   blue   ", green="   green)
  }


}



class Color(red: Int, blue: Int, green: Int)

缺省参数

具名参数缺省参数 一块使用时,具名参数显得更有用。 这里的 缺省参数 指的是在类定义中给出其缺省值:

render4Default函数第二、三个参数有缺省值,所以在调用时可以通过以下方式使用:

//调用缺省值的函数时,缺省参数可以不指定 render4Default(red = 1);

示例代码如下:

代码语言:javascript复制
package com.byron4j.scala.basic

object NamedArgDemo {
  def main(args: Array[String]): Unit = {

    // 具名参数实例 satrt...
    new Color(80, 9, 100);
      // 创建具有参数列表的类实例时,可以指定参数名字
    new Color(red = 80, blue = 9, green = 100);
    // 具名参数实例 end.


    render(red = 1, blue = 2, green = 3);

    //调用缺省值的函数时,缺省参数可以不指定
    render4Default(red = 1);

  }

  def  render(red: Int, blue: Int, green: Int): Unit= {
    println("red="   red   ", blue="   blue   ", green="   green)
  }

  //缺省值
  def  render4Default(red: Int, blue: Int = 10, green: Int = 20): Unit= {
    println("red="   red   ", blue="   blue   ", green="   green)
  }
}



class Color(red: Int, blue: Int, green: Int)

输出:

red=1, blue=2, green=3 red=1, blue=10, green=20

如果所有参数都是缺省的,则创建类实例、调用函数时可以省略参数列表

函数:

def render4AllDefault(red: Int = 5, blue: Int = 10, green: Int = 20): Unit= { println(“red=” red “, blue=” blue “, green=” green) }

调用:

render4AllDefault()

类参数全部缺省:

class Color4AllDefault(red: Int = 4, blue: Int = 6, green: Int = 7){ println(“创建 Color4AllDefault 实例”) }

创建类实例:

var v = new Color4AllDefault

创建实例 v 的同时,我们看到执行了类体,在控制台输出了:创建 Color4AllDefault 实例

0 人点赞