問題タブ [enrich-my-library]
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.
scala - Scala、イテレータを拡張
イテレータを拡張して新しいメソッドを作成しようとしています。このメソッドは、最後の要素takeWhileInclusive
と同じように動作しますが、含まれています。takeWhile
私の問題は、イテレータを拡張して、遅延評価したい新しいイテレータを返すためのベストプラクティスです。私は通常C#のバックグラウンドから来IEnumerable
てキーワードを使用してyield
いますが、そのようなオプションはScalaには存在しないようです。
たとえば、私は持つことができます
したがって、この場合、takeWhileInclusive
6より大きい結果が得られるまで、値の述語のみが解決され、この最初の結果が含まれます。
これまでのところ:
scala - Scalaでenrich-my-libraryを使用する最良の方法は何ですか?
それを実装する2つの異なる方法があります。
1つはもっと短い
2番目はもっと長い
どちらがいいですか?
java - オプション化された Java ゲッター
Scala から Java を扱う場合、null を考慮する必要があります。
たとえば、HttpServletRequest ゲッター (getAttribute、getHeader など) はすべて null を返す可能性があります。
HttpServletRequest メソッドを呼び出すたびに手動で case/match または map 操作を実行できることはわかっていますが、それは少し面倒です。また、request.getHeader("Accept-Encoding") のようなメソッド呼び出しは一口です。
両方の問題を処理するためのエンリッチメントを思いつきました。
1) 同じ/類似の効果を達成するために、enrich-my-library 以外の別の/より良い方法はありますか?
2)これが「その」方法である場合、パフォーマンスへの影響/リスクは何ですか?言い換えれば、このパターンの明白な有用性/利便性にやけどをすることはありますか?
これが明らかな場合は申し訳ありませんが、先日強化を開始したばかりで、非常に便利なようです。適切なシナリオでパターンを適用していることを確認したいだけです...
EDIT
@dhg は、 Option.apply() と次のことを指摘しました。
同等であるため、getter メソッドは無関係な safe(f()) ラッパーの代わりに Option(f()) を使用するようになりました
ありがとう
json - 濃縮に基づいて動的にディスパッチする方法は?
Spray-jsonライブラリは、基本的なScalaタイプをtoJson
メソッドで拡張します。Any
基になるタイプにそのようなヒモがあるJsValue
場合は、をに変換したいと思います。私の最善の試みはうまくいきますが、冗長です:
理想的には、私はこのようなもの(不可能)を好むでしょう:
強化されたすべてのタイプを列挙せずにこれを行う方法はありますか?
scala - コードを別のオブジェクトにラップせずに Scala クラスを「強化」する方法はありますか?
Scala 2.9 では、カスタム メソッドをライブラリ クラスに追加する (エンリッチまたは "pimp") には、次のように記述する必要がありました。
Scala 2.10 がリリースされたとき、匿名クラスのオブジェクトを返す暗黙的なメソッドの必要性を取り除くことで、理論的には上記のタスクを単純化することを意図した暗黙的なクラス定義が導入されたことを読んだことがあります。私はそれが私がただ書くことを可能にするだろうと思った
これは私にとってはるかにきれいに見えます。ただし、そのような定義はコンパイル エラーを引き起こします。
これは、コードをオブジェクトに再度ラップすることで解決されます。
言うまでもなく、これは改善の感覚をほとんど中和します。
では、短く書く方法はありますか?ラッパー オブジェクトを取り除くには?
私は実際MyApp.pimps
にすべての売春斡旋業者が行くパッケージを持っており(あまり多くはありません。持っていれば別のパッケージを使用します)、orのMyApp.pimps.StringPimper._
代わりにインポートするのにうんざりしています。もちろん、すべての暗黙的なクラスを 1 つのラッパー オブジェクトに入れることもできますが、これはそれらすべてを 1 つのファイルに入れることを意味し、かなり長くなり、非常に醜い解決策になります。MyApp.pimps.PimpedString
MyApp.pimps._
scala - オーバーヘッドなしで値クラスを強化するにはどうすればよいですか?
Scala 2.10 では値クラスが導入されており、これはクラスを extends にすることで指定できますAnyVal
。値クラスには多くの制限がありますが、それらの大きな利点の 1 つは、新しいクラスを作成するペナルティなしで拡張メソッドを使用できることです。値クラスを配列に入れるなどのボックス化が必要でない限り、それは単純に古いクラスに加えたものです。クラスを最初のパラメーターとして受け取る一連のメソッド。したがって、
i + j*j
(JVM がメソッド呼び出しをインライン化すると) 自分で作成するよりもコストがかからないものにアンラップします。
残念ながら、値クラスを記述するSIP-15の制限の 1 つは、
- C の基になる型は、値クラスではない場合があります。
たとえば、ボクシングのオーバーヘッドなしでタイプセーフなユニットを提供する方法として、手に入れることができる値クラスがある場合 (本当に必要な場合を除く):
それでは、Meter
オブジェクト作成のオーバーヘッドなしでエンリッチする方法はありますか? SIP-15 の制限により、明らかな
アプローチ。
c# - Enrich-My-Library の最適化
免責事項: 私は C# から Scala にたどり着きました。C# では LINQ を高く評価していました。したがって、私はすぐにイテレータとシーケンスに慣れました。「C# スタイル」の利回りを逃しましたが、継続を使用して自分でクックすることができました...パフォーマンスが低下したとしても。
今では、C# でコレクションに対するメソッドが欠落している場合、それを拡張メソッドとして定義するだけで、コンパイラはコードを効率的に処理するという非常に優れた仕事をしてくれます。Scala では、Pimpのエンリッチ My Library アプローチを使用していますが、パフォーマンスが少し心配です。
ただし、私の「yield iterator」とは対照的に、これは認識された一般的なパターンです。Scala コンパイラーはそれを最適化し、一時オブジェクトの作成を削除しますか?
そうでない場合、なぜですか?私にとっては、適切で安全な最適化のように見えます。コンパイラを正しい方向に「ヒント」または「強制」できますか? より高速な代替手段はどれですか?
イテレータ/イテラブルを介してアルゴリズムのコレクションにパターンを使用したいので、それらをフィルター/マップ/などとして記述できますcollection.baz(lambda).bar(lambda2)
が、「重すぎる」ことが判明するのではないかと心配しています。(より効率的/直接的ですが、醜い と比較してbar(lambda2, baz(lambda, collection)
)
scala - 型パラメーターの1つがNothingである必要があるのに、Scalaの暗黙のクラスが機能しないのはなぜですか?
更新:コンパイルしてテストできるように例を変更しました。
エンリッチメントメソッドを定義する暗黙のクラスがあります。
問題は、2番目の例の場合R
は機能しないことです。Nothing
コンパイラエラーが発生します。このような場合、次のコンパイラエラーが発生します。
なぜこれが起こるのですか?
私はその場合のために別の暗黙のクラスを作成することによってそれを解決することができました:
しかし、将来的にはScalaの動作に依存することはできますか?それはNothing
オプションとは見なされませんR
か?将来それが変更された場合、2つの異なる適用可能な暗黙が存在するため、コードは機能しなくなります。
scala - すべての Traversable の Enrich-My-Library
Traversable[_]
コレクションとスワップするインデックスを指定して、任意の で機能する機能的なスワップ関数を作成する方法を見つけようとしていました。私は次のことを思いつきました:
これを Traversable の暗黙的な拡張にして、 で呼び出せるようにする方法を知りたいですList(1,2,3,4,5).swap(0, 4)
。私が得ることができた最も近いものは次のとおりでした:
残念ながらそれだけではありません。を呼び出すList(1,2,3,4,5).swap(0, 4)
と、次のエラーが発生します。
エラー: List[Int] => Traversable[A] から利用可能な暗黙的なビューはありません
何かが欠けているか、問題を非常に複雑にしているに違いないと感じています。これがどのように構成されるべきか誰かが知っていますか?
注: これは純粋に学術的なものであり、実稼働環境では決して使用されていません。Scala の型システムと境界をうまく扱えるようにしています。
scala - 型推論を失わずに Function を暗黙的に拡張する方法
DSL の場合、関数値を暗黙的に拡張する必要があります。例えば:
を使用する関数はPimpedFunction
、次のように定義できます。
問題は、 を呼び出すコードにありますtakes
。以下は期待どおりに機能します。
しかし、パラメーターの型を省略した場合、コンパイルはそれを推測できません。
scalac の推論を助けるために何かを変更できますか?
OBS: 実際のユースケースはこれに関連しています: https://gist.github.com/xeno-by/4542402