2011-08-05 3 views
3

共通エンリッチマイライブラリパターンがメソッドを暗黙的にマークすることができますが、コンストラクタではないのはなぜですか?

class Foo(value: Int) 

implicit def int2Foo(i: Int) = new Foo(i) 

なぜそれだけでコンストラクタことを考えると、この

class Foo implicit (value: Int) 

のようなコンストラクタ自体にimplicitを追加することはできませんのようなもののようですいくつかの追加制限付きの方法ではありませんか?

驚くべきことに、以下の作業を行います。

class Foo(value: Int) { 
    implicit def this(a: String) = this(a.toInt) 
} 
+0

[Pimp My Library](http://www.artima.com/weblogs/viewpost.jsp?thread=179766)ではありませんか?もしそうなら、[そのためのタグ](http://stackoverflow.com/questions/tagged/pimp-my-library)があります。 – huitseeker

+0

はい、私はそれを意味しました... :-) – soc

+0

FYI:https://issues.scala-lang.org/browse/SI-4882 – gerferra

答えて

5

私は(上記の私のコメントを参照)が正しくあなたの質問を理解していれば、あなたがこれに金額を考えている:

implicit class Foo(val i : Int) { 
... 
} 

することに達するだろう。

implicit def int2Foo(x : Int) = new Foo(x) 
class Foo(val i : Int) { 
... 
} 

あなたが気にしている以上に、there probably is some more thought to be given to the problemは避けるべきですコンストラクタ宣言のセマンティクスを複雑化します。

小規模な構文の追加が行われている限り、これはsuggestedであり、Martin Oderskyのreceived nuanced but relatively positive commentsですが、まだ実装に関するニュースはありません。

+0

いいえ、本当は...なぜここでdesugaringする必要がありますか?私の考えは、単純にコンストラクタに '暗黙的に'を加えることを許していました。クラスに '暗黙的に'を追加しますか?セマンティクスが何であるべきかわからない... – soc

+1

その場合、「コンストラクタに暗黙的に追加することを許可する」とはどういう意味ですか? – huitseeker

+0

私はちょうどあなたのdesugaringの提案のポイントが表示されません。それは現在のようには機能しませんが、なぜそれがいくつかの "特別なケース"のために追加されるべきですか? – soc

関連する問題