2016-02-28 89 views
1

我在scala返回要麼nullList[Double]List[List[List[Double]]]按條件已經函數。我使用關鍵字Any來定義return type,它適用於我,但如果我試圖使用List的屬性(如返回值的「長度」),它會給我錯誤,如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 as (Type A || Type B)但我得到了一些錯誤not found type ||。任何幫助都會非常有用。

+0

OR運算符爲類型被稱爲'\ /'(類似的邏輯析取符號,∨),並且可以在[Scalaz]中找到(https://scalaz.github.io/scalaz/)圖書館。 –

+6

我可能會建議你返回'Option [或者[A,B]]'。 'Option []'這樣你可以使用'None'而不是'null'和'''''''在兩個不相關的類型中進行選擇。 – jwvh

+0

如果你只需要結果列表的屬性,你可以使用返回類型:'List [Any]'。它可以處理所有三種可能的返回值,儘管這不是一個好的設計。 – ntn

回答

2

如果您知道您的返回類型始終爲空(空)或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") 
} 
+0

沒有不是null。 –

+0

我並不是指Scala中的Nothing類型。沒有字面意思,你沒有任何東西可以返回(或爲空)。也許我不應該利用它。 – marios