2013-02-27 6 views

答えて

132

次のようなことがいくつかあります。

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

第2に、「暗黙の変換」が適用されます。 20のでIntあるとIntにはseconds方法、Intを取り、あなたのメソッド呼び出しの範囲によって制約検索して、secondsメソッドを持っていない何かを返し、暗黙的な変換のためのコンパイラの検索を持っていません。

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

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

**実際には、DurationIntは値クラスなので、実際にはそうではありません。そのため、可能であればコンパイラは整数をラップしないようにします。

+66

十分に高度な技術は、魔法と区別できません。 – ripper234

+4

幸いにも、ほとんどのIDEはそれを区別することができます!暗黙的な変換はScalaでかなり多く使用されます。テキストファイルを読んでいるだけの方は混乱するかもしれませんが( "その方法はどこから来ていますか?")、適切なツールサポートがあれば、あなたの道を見つけることができます。その時点でScalaは美しく意味深く簡潔になります。 (例えば、20秒は 'new DurationInt(20).seconds()'よりもはるかに読みやすくなります) –

+1

implicitsを使って自分自身を見つけた場合は、彼らの助けなしに同じことを達成する。 http://twitter.github.com/effectivescala/#TypesとGenerics-Implicits – oluies

6

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

関連する問題