在Scala中,tuple语法是语言本身的一部分还是TupleN上的隐式构造函数调用?

时间:2016-06-27 11:02:42

标签: scala

<ul>
  <li class="question">Question 1</li>
  <li class="question">Question 2</li>
  <li class="question">Question 3</li>
  <li class="question">Question 4</li>
  <li class="question">Question 5</li>
</ul>
Exercises:
<ul>
  <li class="exercise">Exercise 1</li>
  <li class="exercise">Exercise 2</li>
  <li class="exercise">Exercise 3</li>
  <li class="exercise">Exercise 4</li>
  <li class="exercise">Exercise 5</li>
  <li class="exercise">Exercise 6</li>
</ul>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

val tuple3 = Tuple3(1, 2, 3) 的{​​{1}}。但为什么这是可编辑的:

apply

隐式调用Tuple3吗?基于什么?

或者是val tuple = (1, 2, 3) 来电,我在Tuple3.apply或其他任何地方找不到定义?

2 个答案:

答案 0 :(得分:4)

  

Tulele3.apply隐式调用吗?基于什么?

它不是隐式地称为 ( )语法只是TupleN上的语法糖。在这里它被转换为Tuple3.apply。它基于编译器对文本的解释来调用,该解释基于Scala规范(参见Section 6.9, Tuples):

  

6.9元组

     

SimpleExpr ::= (' [Exprs] )'

     

元组表达式(e1,…,en)是类实例的别名   创建scala.TupleN(e1,…,en),其中n≥2。空元组()是   类型scala.Unit的唯一值。

您可以使用scalac -Xprint:typer标志创建查看类型树。这样:

object Y {
  val tuple = (1,2,3)
}

变成:

package <empty> {
  object Y extends scala.AnyRef {
    def <init>(): Y.type = {
      Y.super.<init>();
      ()
    };
    private[this] val tuple: (Int, Int, Int) = scala.Tuple3.apply[Int, Int, Int](1, 2, 3);
    <stable> <accessor> def tuple: (Int, Int, Int) = Y.this.tuple
  }
}

答案 1 :(得分:1)

在Scala语言规范[1]中,您可以阅读:

  

元组表达式(e1,...,en)是类实例的别名   创建scala.Tuplen(e1,...,en),其中n≥2。空元组()是   scala.Unit。

类型的唯一值

我认为,scalac基本上用(...)

替换所有Tuple(...)

[1] http://www.scala-lang.org/files/archive/spec/2.11/06-expressions.html