はどのように以下のコンパイルではない:Scalaで'20秒 'はどのように機能しますか?
import scala.concurrent.duration._
val time = 20 seconds
は、実際にここで何が起こっていますか?
はどのように以下のコンパイルではない:Scalaで'20秒 'はどのように機能しますか?
import scala.concurrent.duration._
val time = 20 seconds
は、実際にここで何が起こっていますか?
次のようなことがいくつかあります。
最初に、Scalaでは、多くのメソッド呼び出しでドットと括弧を省略することができるため、20 seconds
は20.seconds()
*に相当します。
第2に、「暗黙の変換」が適用されます。 20
のでInt
あるとInt
にはseconds
方法、Int
を取り、あなたのメソッド呼び出しの範囲によって制約検索して、はseconds
メソッドを持っていない何かを返し、暗黙的な変換のためのコンパイラの検索を持っていません。
DurationIntをスコープにインポートしました。 DurationInt
はInt
パラメータを持つ暗黙のクラスであるため、そのコンストラクタは暗黙のInt => DurationInt
変換を定義します。 DurationInt
はseconds
メソッドを持つため、すべての検索基準を満たします。したがって、コンパイラはあなたの呼び出しをnew DurationInt(20).seconds
**と書き換えます。
*これはゆるやかです。 20.seconds()
は実際には無効です。seconds
メソッドにはパラメータリストがないため、はメソッド呼び出しでを省略する必要があります。
**実際には、DurationInt
は値クラスなので、実際にはそうではありません。そのため、可能であればコンパイラは整数をラップしないようにします。
ここで起こっている「魔法」は「暗黙の変換」と呼ばれます。暗黙的な変換をインポートしていて、その中にはInt(およびDouble)とDurationの間の変換を処理するものもあります。それはあなたが扱っているものです。
十分に高度な技術は、魔法と区別できません。 – ripper234
幸いにも、ほとんどのIDEはそれを区別することができます!暗黙的な変換はScalaでかなり多く使用されます。テキストファイルを読んでいるだけの方は混乱するかもしれませんが( "その方法はどこから来ていますか?")、適切なツールサポートがあれば、あなたの道を見つけることができます。その時点でScalaは美しく意味深く簡潔になります。 (例えば、20秒は 'new DurationInt(20).seconds()'よりもはるかに読みやすくなります) –
implicitsを使って自分自身を見つけた場合は、彼らの助けなしに同じことを達成する。 http://twitter.github.com/effectivescala/#TypesとGenerics-Implicits – oluies