簡體   English   中英

Scala函數返回類型為或

[英]scala function return type either or

我已經一個函數scala返回無論是 nullList[Double]List[List[List[Double]]]按條件。 我使用了關鍵字Any來定義return type ,它對我有用,但是如果我嘗試在返回值上使用List的屬性,例如'length',則會出現錯誤,因為value length is not a member of Any 目前,我已將功能定義為:

def extract_val(tuple: Tuple3[String,List[Double],List[List[List[Double]]]]): (Any) ={
     /*
        do something here
     */
}

我試圖找出某種方式,以便我可以在函數定義中定義或返回類型為:

def extract_val(tuple: Tuple3[String,List[Double],List[List[List[Double]]]]): (either Type A or either Type B) ={
     /*
        if something :
          return null
        elif something:
          return Type A
        elif something 
          return Type B
     */
}

我將OR operator用作(Type A || Type B)但由於not found type ||而遇到了一些錯誤 任何幫助將非常有用。

如果您知道返回類型總是為空(空)或A或B,則使用Option[Either[A,B]]是最快的方法。

該解決方案的主要局限性在於,很難將其擴展為更多類型的C,D等。

如果您需要可擴展性,則可以實現自己的OneOf類型。 您可以在Scala中相對輕松地完成此操作。

sealed trait OneOf[A,B,C]
case class First[A,B,C](a: A) extends OneOf[A,B,C]
case class Second[A,B,C](b: B) extends OneOf[A,B,C]
case class Third[A,B,C](c: C) extends OneOf[A,B,C]

這是一個簡單的(玩具)用例:

def x(i: Int): OneOf[Int,Boolean,Double] =  i match {
   case 1 => First(10)
   case 2 => Second(true)
   case _ => Third(0.2)
}

scala> x(2)
res1: OneOf[Int,Boolean,Double] = Second(true)

scala> x(1)
res2: OneOf[Int,Boolean,Double] = First(10)

scala> x(2)
res3: OneOf[Int,Boolean,Double] = Second(true)

scala> x(3)
res4: OneOf[Int,Boolean,Double] = Third(0.2)

這是一個采用OneOf並以不同方式處理每個選項的方法。

def takeOneOf[A,B,C](x: OneOf[A,B,C]) = x match {
     case First(a) => println(s"A=$a")
     case Second(b) => println(s"B=$b")
     case Third(c) => println(s"C=$c")
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM