Scala特质trait用法介绍和详细指南

2021年4月5日15:20:55 发表评论 1,073 次浏览

本文概述

Scala trait用法:封装提供详尽检查为我们的应用程序。穷举检查允许检查是否必须在与源文件相同的文件中声明密封特征的所有成员。这意味着必须包括的特征的所有可能的已知成员都已被编译器预先知道。因此, 这给我们带来了防止代码出错的优势。

句法 : 

sealed trait X
class A extends X
class B extends X
class C extends X

详尽检查主要用于/模式匹配在Scala。假设我们有一个密封的特征X和扩展特征X的类。在匹配特征X的子类型时, 我们必须确保必须包含所有已知的子类型。下面的方法会给我们一个警告。尽管我们将获得正确的输出, 但是这可能会导致应用程序中意外的运行时崩溃。

Warning: match may not be exhaustive
def obj(item: X) = item match {
   case A => //
   case B => //
}

正确的执行方式将是-

def obj(item: X) = item match{
   case A => //
   case B => //
   case C => //
   or 
   case _ => //for covering all the remaining cases
}

让我们来看看以下程序在文件另存为语言标量:-

范例: 

Scala trait用法示例

// Scala Program that illustrates sealed trait
// language.scala
sealed trait Geeks
{
     val article = "not done"
}
 
// Class extends trait
class Scala extends Geeks
{
     override val article = "scala article"
}
 
// Class extends trait
class Java extends Geeks
{
     override val article = "java article"
}
 
// Class extends trait
class Csharp extends Geeks
{
     override val article = "csharp article"
}
 
// Creating object
object GFG
{
     // Main method
     def main(args : Array[String])
     {
         val s = new Scala
         val j = new Java
         val c = new Csharp
         println(checkArticle(s))
         println(checkArticle(j))
         println(checkArticle(c))
     }
     
     // Defined function
     def checkArticle(Article : Geeks) : String = Article match
     {
         case s : Scala  => s.article
         case j : Java   => j.article
         case c : Csharp => c.article
         //exclusion of <strong>line 45</strong> would lead to warning
     }
}

输出: 

scala article
java article
csharp article

Scala trait用法的一些重点

  • 特质的子类型是预先已知的-如果在模式匹配中不包含任何密封的C类子类型, 则会给我们警告。这样的警告告诉你, 由于未处理某些可能的模式, 因此代码可能会产生匹配错误异常。该警告指出了运行时错误的潜在根源, 因此通常在正确设置程序方面是受欢迎的帮助。
     
  • 密封特征只能在与子类型相同的源文件中扩展, 在上面的示例中, 我们还有另一个类python在另一个scala文件中。导入特征极客从语言标量我们将收到如下错误消息。
illegal inheritance from sealed trait bag
import geeks
class python extends geeks{
    val article="python article";
}
  • 密封类也主要用于枚举–防止非法继承并使用所有子类型, 以避免详尽的匹配警告。
    范例:

Scala

// Scala Program that illustrates sealed trait
// By using Enumeration
sealed trait card extends Enumeration
 
// Class extends trait
case object CLUB extends card
 
// Class extends trait
case object HEART extends card
 
// Class extends trait
case object DIAMOND extends card
 
// Class extends trait
case object SPADE extends card
 
// Creating object
object obj 1
{  
     // Main method
     def main(args : Array[String])
     {
         val card 1 = HEART
         val card 2 = CLUB
         val card 3 = SPADE
         val card 4 = DIAMOND
         println(checkcard(card 1 ))
         println(checkcard(card 2 ))
         println(checkcard(card 3 ))
         println(checkcard(card 4 ))
     }
     
     // Defined function
     def checkcard(x : card) : String = x match
     {
         
         case HEART   => "heart"
         case CLUB    => "club"
         case SPADE   => "spade"
         case DIAMOND => "diamond"
     }
}
heart
club
spade
diamond

以上就是Scala trait用法的详细指南


木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: