阶函数返回类型之一或
我在scala
返回要么null
或List[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 ||
。任何帮助都会非常有用。
如果您知道您的返回类型始终为空(空)或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")
}
没有不是null。 –
我并不是指Scala中的Nothing类型。没有字面意思,你没有任何东西可以返回(或为空)。也许我不应该利用它。 – marios
OR运算符为类型被称为'\ /'(类似的逻辑析取符号,∨),并且可以在[Scalaz]中找到(https://scalaz.github.io/scalaz/)图书馆。 –
我可能会建议你返回'Option [或者[A,B]]'。 'Option []'这样你可以使用'None'而不是'null'和'''''''在两个不相关的类型中进行选择。 – jwvh
如果你只需要结果列表的属性,你可以使用返回类型:'List [Any]'。它可以处理所有三种可能的返回值,尽管这不是一个好的设计。 – ntn