回答:
いくつかのことが進行中です。
まず、Scalaでは多くのメソッド呼び出しでドットと括弧を省略できるため20 seconds
、20.seconds()
* と同等です。
次に、「暗黙の変換」が適用されます。以来で20
あるInt
とInt
何も持っていないseconds
取り暗黙的な変換のための方法、コンパイラを検索Int
し、何かを返していないseconds
、あなたのメソッド呼び出しの範囲によって制約検索して、方法を。
スコープにDurationIntをインポートしました。以来DurationInt
と暗黙のクラスであるInt
パラメータ、そのコンストラクタは、暗黙的な定義Int => DurationInt
変換。DurationInt
持っているseconds
方法を、それを満たすすべての検索条件。したがって、コンパイラは呼び出しをnew DurationInt(20).seconds
**に書き換えます。
*ゆるいという意味です。メソッドにはパラメータリストがないため、メソッド呼び出しで括弧を省略する必要が20.seconds()
あるため、実際には無効です。seconds
**実際には、これはDurationInt
値クラスなので真実ではありません。コンパイラーは、可能であれば整数をラップしないようにします。
new DurationInt(20).seconds()
それがどのように行われるかを知っている限り、はるかに読みやすくなります)
seconds
メソッドは括弧なしで定義されているため、括弧で呼び出すとエラーになります。
20.seconds()
Scalaで書けることを示唆するつもりはありませんでした。コンパイラーがその呼び出しをそのように翻訳しているということだけです。この場合のように、対応するメソッドにパラメーターリストがない場合、Scala では括弧を省略する必要があることを指摘しておくのは価値があります。
そこで行われている「魔法」は「暗黙の変換」と呼ばれます。暗黙的な変換をインポートしており、その一部はInt(およびDouble)からDurationへの変換を処理します。それはあなたが扱っているものです。
import scala.concurrent.duration._
解決する20 seconds
が、実際にDurationConversions
トレイトをインポートしない理由は何ですか? 編集:ちょうど彼らが実際にインポートしているものであることに気づきましたDurationInt
。これは実際の特性をインポートできないためだと思いますか?特性の具体的な実装のみですか?