回答:
いくつかのことが進行中です。
まず、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。これは実際の特性をインポートできないためだと思いますか?特性の具体的な実装のみですか?