我可以在Scala中创建空元组或字符串吗?

时间:2016-05-24 14:44:35

标签: scala

我需要返回元组,但是如果出现问题我想要返回空元组,例如列表中的Seq.empty[Type]Nil。可能吗? 我也很好奇是否可以使用String类型。

2 个答案:

答案 0 :(得分:8)

  

我想要返回空元组

这没有意义。元组不是集合。 “空虚”的概念简直是非感性的。元组的长度是其类型的一部分。因此,空元组是一种与非空元组不同的类型。

事实上,谈论“元组”作为一种类型甚至没有意义。有成对(2元组又名Tuple2),三元组(3元组又名Tuple3),四元组,五元组,六元组,七元组,八元组,9元组,10元组等等都是不同的类型。

此外,或多或少你可以用元组做的唯一合理的事情就是提取它的元素。所以,对于没有元素的元组,你几乎没有任何明智的事情可以做。没有值且没有操作的结构有什么用?这完全没用。

实际上,0元组与Unit值同构,该值表示缺少有用值。在Scala和Haskell中,空元组的语法实际上用于表示Unit值:

val u = ()
// => u: Unit = ()
  

我也很好奇是否可以使用String类型。

是的,当然,你可以有一个空字符串:

val s = ""
// => s: String = ""

答案 1 :(得分:1)

因为您需要返回一个可能出错的值。在Scala中,推荐的处理方法是返回Option,Try或Either值。

例如:

def somethingThatCanGoWrongWithTry(): Try[(Int, String)] = {
  Try{
    val intValue = sideEffectValueInt()
    val stringValue = sideEffectValueString()
    (intValue, stringValue)
  }
}

def somethingThatCanGoWrongWithOption(): Option[(Int,String)] = {
  Try {
    val intValue = sideEffectValueInt()
    val stringValue = sideEffectValueString()
    (intValue, stringValue)
  }.toOption
}

def somethingThatCanGoWrongWithEither(): Either[Oops, (Int,String)] = {
  Try {
    val intValue = sideEffectValueInt()
    val stringValue = sideEffectValueString()
    (intValue, stringValue)
  } match {
    case Success(value) => Right(value)
    case Failure(exception) => Left(Oops(exception))
  }
}