3

一般的な Enrich-My-Library パターンは次のようなものです

class Foo(value: Int)

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

implicitこのようにコンストラクター自体に追加することができないのはなぜですか

class Foo implicit (value: Int)

コンストラクターは、いくつかの追加の制限があるメソッドにすぎないと考えていますか?

驚くべきことに、以下は機能します。

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

1 に答える 1

5

私があなたの質問を正しく理解していれば(上記の私のコメントを参照)、あなたが考えていることは次のとおりです。

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

次のようになります。

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

それがあなたが念頭に置いている脱糖以上のものである場合は、コンストラクター宣言のセマンティクスを過度に複雑にすることを避けるために、問題にさらに考慮すべきことがあるでしょう。

しかし、小規模な構文の追加に関する限り、これは提案されており、Martin Odersky からニュアンスはあるものの比較的肯定的なコメントを受けていますが、実装に関するニュースはまだありません。

于 2011-08-05T10:44:37.130 に答える