Scala中的命名参数和默认参数值

时间:2020-02-23 14:41:36  来源:igfitidea点击:

在本文中,我们将讨论Scala中有关函数(方法)或者构造函数参数的以下两个重要概念

  • 命名参数
  • 默认参数值

介绍

假设我们将在Scala中开发HRMS(人力资源管理系统)模块。
它具有以下Employee类。

员工规模

class Employee(val firstName: String, val lastName:String){    
   def fullName(delimiter:String):String = firstName + delimiter + lastName

   //Some useful code goes here
}

注意:-我们将使用此代码段通过简单的示例来探索此发布目标。

在Scala中,通常我们进行一个Function(方法)调用或者Constructor调用,如下所示:

在Scala中进行构造函数调用

scala> var emp1 = new Employee("Ram","Posa")
 emp1: Employee = Employee@563e4951

Scala中的方法调用

scala> emp1.fullName("-")
res1: String = Ram-Posa

如果构造函数或者函数具有太多相同类型的参数,则客户端可能会对将参数传递给它们感到困惑。
在我们的示例中,Employee类构造函数具有两个相同Type的参数:String。
在这种情况下,客户可能会对名字和姓氏顺序感到困惑。

如果客户端以不同的顺序传递参数,如下所示,我们将得到一些意外的结果。
它不会产生任何编译或者运行时错误,但会产生一些意外结果

scala> var emp1 = new Employee("Posa","Ram")
 emp1: Employee = Employee@563e4951

 scala> emp1.fullName("-")
 res1: String = Posa-Ram

为了解决此问题,Scala具有一些功能,如命名参数和默认参数值。
我们将在下一节中讨论这两个概念。

什么是命名参数

命名参数表示在进行函数(方法)调用或者构造函数调用时,我们显式使用参数名称(自变量或者变量)。

具有命名参数的构造函数调用语法:

Constructor-Name(Parameter1-Name = Value1,  Parameter2-Name = Value2)

此语法非常简单。
每个参数值前面都有一个参数名称。
参数名称和参数值都用等号(=)分隔。

即使使用命名参数进行功能(方法)调用,我们也使用相同的语法。

Scala中的命名参数

在Scala 2.8之前,我们有这个问题。
为了解决这些问题,Scala 2.8引入了一个称为"命名参数"的新功能,可以轻松地使用太多相同类型的参数(参数)进行函数调用或者构造函数调用。

示例:-使用我们先前的HRMS Employee组件来探索此语法。

scala> var emp2 = new Employee(firstName="Ram", lastName="Posa")
emp2: Employee = Employee@569e4901

scala> emp2.fullName("-")
res2: String = Ram-Posa

如果使用名称参数,则无需担心参数顺序。
即使我们以不同的顺序拨打电话,仍然会得到如下所示的相同结果。

scala> var emp3 = new Employee(lastName="Posa",f irstName="Ram")
emp3: Employee = Employee@511e4001

scala> emp3.fullName("-")
res2: String = Ram-Posa

注意:-如果我们使用所有命名参数进行构造函数或者函数调用,则参数顺序没有问题。
根据我们的方便,我们可以按任何顺序传递它们。
但是,如果我们有任何未命名的参数,则应先声明未命名的参数,然后再声明已命名的参数。

示例:-假设我们的HRMS Employee组件还有一些未命名的构造函数参数,例如empid,如下所示:

class Employee( val empid:Int, val firstName: String, val lastName:String){    
   def fullName(delimiter:String):String = firstName + delimiter + lastName

   //Some useful code goes here
}

在这种情况下,我们几乎没有其他方法可以调用Employee Constructor。

  • 将命名参数用于Employee构造函数的所有参数,并以任何顺序使用它们。

例:

scala> var emp4 = new Employee(lastName="Posa", firstName="Ram", empid=1001)
 emp4: Employee = Employee@50378a4
  • 如果我们将"命名参数"和"未命名参数"混合使用,则应首先使用该未命名参数。
scala> var emp5 = new Employee(1001, firstName="Ram", lastName="Posa")
 emp5: Employee = Employee@6d5620ce

注意:-未命名参数也称为"位置参数",因为它们使用位置进行函数或者构造函数调用。

Scala中命名参数的优点

在Scala中,命名参数具有以下优点:

  • 在将参数传递给方法或者构造函数调用时,它避免了客户端的混乱。

  • 它提高了代码的可读性。

注意:Java不支持命名参数。
但是,我们可以通过使用Builder设计模式来实现此方法。

命名和未命名参数之间的区别

  • 命名参数使用参数名称进行函数或者构造函数调用。
    未命名参数使用参数位置进行函数或者构造函数调用。

  • 我们可以以任何顺序传递命名参数。
    对于未命名参数,我们应遵循相同的顺序。

注意:-我们可以混合使用命名和位置(未命名)参数来进行函数或者构造函数调用。

在基于实时Scala的应用程序中,我们使用命名参数和默认参数。
我们将在下一节中讨论它。

什么是默认参数

默认参数意味着在函数或者构造函数的参数定义中分配一些默认值。

具有默认参数的构造函数语法:

Class-Name(Parameter1-Name : Type = Default-Value1, 
          Parameter2-Name : Type = Default-Value2)

此语法非常简单。
每个"参数默认值"前均带有"参数名称和类型"。
参数名称和参数值都用等号(=)分隔。

即使使用默认参数定义函数(方法),我们也使用相同的语法。

Scala中的默认参数值

Scala 2.8引入了另一个新功能,称为"默认参数",以使函数调用或者构造函数调用更加容易。

例:

员工规模

class Employee(val empid:Int, val firstName: String, val lastName:String){    
   def fullName(delimiter:String = " "):String = firstName + delimiter + lastName

   //Some useful code goes here
}

其中fullName方法具有带有一些默认值的默认参数"定界符"。

scala> var e1 = new Employee(1002, lastName = "Posa", firstName="Ram")
e1: Employee = Employee@93081b6

scala> e1.fullName("-")
res1: String = Ram-Posa

scala> e1.fullName()
res3: String = Ram Posa

scala>

如果需要,我们可以使用Parameters进行Function调用。
否则,我们使用默认参数。

其中我们同时使用命名参数进行构造函数调用和默认参数进行函数调用。

简单语法:-参数名称:类型=表达式或者值

我们还可以在定义默认参数时使用表达式。
每当我们调用该函数或者构造函数时,都会对该表达式进行求值。

注意:-我们可以混合使用命名和未命名参数以及默认和非默认参数。

Scala中默认参数的优点

在Scala中,默认参数具有以下优点:

  • 可以实现可选参数。

  • 它避免了代码重复。

注意:Java不支持"默认参数"概念。
为此,我们需要使用重载概念来提供不同的构造函数或者方法。