[英]scala function return type either or
我已經一個函數scala
返回無論是 null
或List[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.