<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
或其他任何地方找不到定义?
答案 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