既然无法定义一个只包含一个元素的tuple,如下:
[scala]
scala> val t1 = (“a”) //只有一个元素时小括号不被认为tuple
t1: String = a
scala> val t1 = (“a”,”B”) //至少要2个元素
t1: (String, String) = (a,B)
[/scala]
为何在scala里还有 Tuple1这样的类型? Tuple又是不可变的,没有理由可以造出一个元素为1的tuple啊
//搞错了,《快学scala》p146页:在scala中,并没有只带一个组件的元组。这句话是错误的。
可以这样产生一个Tuple1,必须用Tuple1这个case类的半生对象来创建。
[scala]
scala> val t1 = Tuple1(“A”)
t1: (String,) = (A,)
[/scala]
TupleX 是通过 extends ProductX 来实现的,每个ProductX都有个半生对象
Product类型是用于描述笛卡尔积(cartesian products )的,似乎与向量无关,就是定义了若干元素的结构。
http://stackoverflow.com/questions/7207527/does-scala-have-syntax-for-0-and-1-tuples
这里有提到Tuple1的用途(并不主流):
http://scala-programming-language.1934581.n4.nabble.com/for-x-String-lt-xs-yield-Why-Hello-There-Tuple1-td2065814.html
为什么例子中的t1在REPL中显示为t1: (String, ) = (A, ) ,而不是t1: (String) = (A) ?
scala> typeOf[Tuple1[String]]
res2: reflect.runtime.universe.Type = (String,)
(String,) 是 Tuple1[String] 的 Type对象的 toString