web-dev-qa-db-ja.com

Scalaで「20秒」はどのように機能しますか?

次のコンパイル方法:

import scala.concurrent.duration._

val time = 20 seconds

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

123
ripper234

いくつかのことが進行中です。

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

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

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

*これは大まかに言っています。 secondsメソッドにはパラメーターリストがないため、20.seconds()は実際に無効です。したがって、メソッド呼び出しでは括弧mustを省略する必要があります。

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

160
Aaron Novstrup

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

7
Bruno Reis