Scala是否具有0元组和1元组的语法?

时间:2011-08-26 16:03:51

标签: scala tuples

scala> val two = (1,2)
two: (Int, Int) = (1,2)

scala> val one = (1,)
<console>:1: error: illegal start of simple expression
       val one = (1,)
                    ^

scala> val zero = ()
zero: Unit = ()

这是:

val one = Tuple1(5)

在Scala中编写单例元组文字真的是最简洁的方法吗? Unit是否像空元组一样工作?

这种不一致是否会困扰其他人?

4 个答案:

答案 0 :(得分:30)

  

在Scala中编写单例元组文字真的是最简洁的方法吗?

  

Unit是否像空元组一样工作?

不,因为它没有实现Product

  

这种不一致是否会困扰其他人?

不是我。

答案 1 :(得分:7)

这是编写一个arity为1的元组的最简洁方法。

在上面的评论中,我看到许多引用“为什么Tuple1很有用”。 Scala中的元组扩展了Product特征,这使您可以迭代元组成员。

可以实现一个类型为Product的参数的方法,在这种情况下,Tuple1是迭代使用多种类型的固定大小集合而不会丢失类型信息的唯一通用方法。

使用Tuple1还有其他原因,但这是我最常见的用例。

答案 2 :(得分:5)

我从未见过Tuple1的一次使用。我也无法想象一个。

在Python中,人们使用它,元组是固定大小的集合。 Scala中的元组不是集合,它们是类型的笛卡尔积。因此,Int x Int只是Tuple2[Int, Int](Int, Int)。当然,IntInt,没有类型是没有意义的。

答案 3 :(得分:0)

之前的答案给出了1元素的有效元组。 对于零元素之一,此代码可以工作:

object tuple0 extends AnyRef with Product {
     def productArity = 0
     def productElement(n: Int) = throw new IllegalStateException("No element")
     def canEqual(that: Any) = false
}