1. ホーム
  2. scala

[解決済み] Scalaで「20秒」はどのように機能するのか?

2022-06-11 02:39:27

質問

以下はどのようにコンパイルするのでしょうか。

import scala.concurrent.duration._

val time = 20 seconds

実際にはどうなっているのでしょうか?

どのように解決するのですか?

いくつかあるようです。

まず、Scalaでは多くのメソッド呼び出しでドットやペレントを省略することができますので 20 seconds というのは 20.seconds() *.

第二に、"暗黙の変換"が適用されます。このため 20Int であり Int には seconds メソッドがない場合、コンパイラは Int を取り、次のようなものを返す暗黙の変換を探します。 を持つ a seconds メソッドがあり、検索はメソッド呼び出しのスコープによって制限されます。

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

*緩やかな意味です。 20.seconds() は実際には無効であり seconds メソッドにはパラメータリストがなく、そのため空白文字である はメソッド呼び出し時に省略されます。

**実際には、これは正確ではありません。 DurationInt は値クラスなので、コンパイラは可能であれば整数のラップを避けるからです。