137

以下はどのようにコンパイルされますか:

import scala.concurrent.duration._

val time = 20 seconds

ここで実際に何が起こっているのですか?

4

2 に答える 2

178

いくつかのことが起こっています。

まず、Scala では、多くのメソッド呼び出しからドットと括弧を省略できるため、*20 secondsと同等20.seconds()です。

次に、「暗黙の変換」が適用されます。20は であり、メソッドIntInt持たないため、コンパイラは、メソッド呼び出しのスコープによって制限された検索で、を受け取り、メソッドを持つものを返すseconds暗黙的な変換を検索します。Intseconds

DurationIntをスコープにインポートしました。DurationIntはパラメーターを持つ暗黙的なクラスであるため、Intそのコンストラクターは暗黙的Int => DurationIntな変換を定義します。DurationIntメソッドを持っているsecondsため、すべての検索条件を満たします。したがって、コンパイラは呼び出しをnew DurationInt(20).seconds** に書き換えます。

※ざっくりとした意味です。メソッドにはパラメーター リストがなく、メソッド呼び出しでは括弧を省略する必要20.seconds()があるため、実際には無効です。seconds

**実際には、 は値クラスであるため、これは正しくありませんDurationInt。そのため、コンパイラは可能であれば整数のラップを回避します。

于 2013-02-27T05:22:53.637 に答える
7

そこで起こっている「魔法」は「暗黙の変換」と呼ばれます。暗黙的な変換をインポートしていますが、その一部は Int (および Double) から Duration への変換を処理します。それがあなたが扱っているものです。

于 2013-02-27T05:07:13.640 に答える