問題タブ [implicit-class]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
480 参照

scala - 暗黙の値クラスのエレガントなグループ化

私は、既存のJavaライブラリー用の暗黙のScalaラッパー・クラスのセットを作成しています (そのライブラリーを装飾して、 Scala開発者にとってより便利なものにすることができます)。

簡単な例として、Javaライブラリ (私は変更できません) に次のようなクラスがあるとします。

ここで、このクラスをScalaスタイルのゲッターとセッターで装飾したいとしましょう。これは、次の暗黙のクラスで行うことができます。

このimplicitキーワードは、ScalaValueコンパイラーに、 のインスタンスを のインスタンスにRichValue暗黙的に変換できることを伝えます (後者がスコープ内にある場合)。これで、内で定義されたメソッドRichValueを のインスタンスに適用できるようになりValueました。例えば:

(これはあまり良いコードではなく、正確に機能するわけでもありません。単純な使用例を示しているだけです。)

残念ながら、Scalaimplicitではクラスをトップレベルにすることは許可されていないためpackage object、. (この制限が必要な理由はわかりませんが、暗黙の変換関数との互換性のためだと思います。)objectclasstraitpackage

ただし、これを値クラスRichValueにするためにからも拡張しています。それらに慣れていない場合は、Scalaコンパイラーが割り当ての最適化を行うことができます。特に、コンパイラは常に のインスタンスを作成する必要はなく、値クラスのコンストラクタ引数を直接操作できます。AnyValRichValue

言い換えれば、Scala の暗黙的な値クラスをラッパーとして使用することによるパフォーマンスのオーバーヘッドはほとんどなく、これは素晴らしいことです。:-)

ただし、値クラスの主な制限は、classまたはtrait;内で定義できないことです。packages、package objects、またはs のメンバーにしかなれませんobject。(これは、外部クラス インスタンスへのポインタを維持する必要がないようにするためです。)

暗黙の値クラスは両方の制約セットを尊重する必要があるため、package objectまたは内でのみ定義できますobject

そしてそこに問題があります。私がラップしているライブラリには、膨大な数のクラスとインターフェースを持つパッケージの深い階層が含まれています。import理想的には、次のような単一のステートメントで ラッパー クラスをインポートできるようにしたいと考えています。

それらをできるだけ簡単に使用できるようにします。

これを達成するために私が現在確認できる唯一の方法は、すべての暗黙的な値クラス定義を 1つのソース ファイル内の 1 つのpackage object(または) 内に配置することです。object

importただし、これは理想とはほど遠いものであり、ターゲット ライブラリのパッケージ構造をミラーリングしながら、1 つのステートメントですべてをスコープに含めたいと考えています。

このアプローチの利点を犠牲にすることなく、これを達成する簡単な方法はありますか?

(たとえば、これらのラッパーを値クラスtraitにするのをやめると、コンポーネント パッケージごとに 1 つずつ、多数の異なる s 内でそれらを定義し、ルートpackage objectにそれらすべてを拡張させて、単一のインポートしますが、利便性のためにパフォーマンスを犠牲にしたくありません。)

0 投票する
1 に答える
58 参照

scala - scala の暗黙的なクラスが期待どおりに出力を表示しない

scala の暗黙的なクラスを含む単純なプログラムを scala で実行しようとしていました。プログラムの期待される出力は「CZF」です。つまり、各文字を1ずつ増やします。しかし、Eclipse IDEで実行すると、結果もエラーも返されません。

端末で次のコードのチャンクを試したとき:

それは私に「CZF」を返しました。私はscala構文に慣れていません。なぜIDEで結果を見ることができないのか、誰でも助けてくれますか?