問題タブ [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の最小限のフレームワーク
新しいジェネリッククラスを構築したいとしNovel[A]
ます。このクラスには多くの便利なメソッドが含まれているため(おそらくコレクションの一種である可能性があります)、サブクラス化する必要があります。ただし、元の型ではなく、サブクラスの型をメソッドが返すようにする必要があります。Scala 2.8では、そのクラスのメソッドが元のサブクラスではなく、関連するサブクラスを返すために必要な最小限の作業はどれくらいですか?例えば、
共変したい場合、この最小量は変わりますNovel
か?
(2.8コレクションは、とりわけこれを行いますが、より派手な(そして便利な)方法でリターンタイプを操作します-問題は、このサブタイプ(常にリターンサブタイプ)のみが必要な場合に、フレームワークをどのように回避できるかです。特徴。)
編集:上記のコードでコピーを作成すると仮定しreverse
ます。インプレース修正を行ってから自分自身を返す場合は、を使用できますthis.type
が、コピーがではないため、それは機能しませんthis
。
Arjanは、次の解決策を提案する別の質問にリンクしました。
これは基本的に、必要なものを取得するための型システムにあります。しかし、これは実際には解決策ではありません。型システムに嘘をついたので、コンパイラーは、私たちが思ったときに本当に戻ってくることを確認するのに役立ちませんShortStory
。(たとえばreverse
、コンパイラーを満足させるために上記の例でオーバーライドする必要はありませんが、型は私たちが望んでいたものではありません。)
scala - 型パラメーターを複製せずに、パラメーター化されたクラスにジェネリック トレイトを混在させる
任意の Traversable[T] にミックスできる特性を作成したいとします。最後に、次のようなことが言えるようになりたいです。
また、次のような Traversable が提供するもので表現される MoreFilterOperations のメソッドがあります。
ただし、問題は明らかに、T が MoreFilterOperations の型パラメーターとして定義されていないことです。それをしたら、もちろん実行可能ですが、コードは次のようになります。
または、このタイプの変数を定義すると:
これは私の好みのために冗長にする方法です。後者を次のように記述できるように特性を定義したいと思います。
自己型、抽象型メンバーを試しましたが、何も役に立ちませんでした。手がかりはありますか?
scala - enrich-my-libraryパターンをScalaコレクションに適用するにはどうすればよいですか?
Scalaで利用できる最も強力なパターンの1つは、enrich-my-library *パターンです。これは、暗黙的な変換を使用して、動的なメソッド解決を必要とせずに既存のクラスにメソッドを追加するように見えます。たとえば、すべての文字列にspaces
空白文字の数をカウントするメソッドが必要な場合は、次のようにできます。
残念ながら、このパターンは、ジェネリックコレクションを処理するときに問題が発生します。たとえば、コレクションを使用してアイテムを順番にグループ化することについて、多くの質問が寄せられています。C
ワンショットで機能するものは組み込まれていないため、これはジェネリックコレクションとジェネリック要素タイプを使用したenrich-my-libraryパターンの理想的な候補のようですA
。
もちろん、それは機能しません。REPLは次のように語っています。
2つの問題があります:C[C[A]]
空のC[A]
リスト(または薄い空気)からどのようにを取得しますか?そして、どうすればラインC[C[A]]
から戻るのではsame +:
なく、ラインから戻ることができSeq[Seq[A]]
ますか?
*以前はpimp-my-libraryと呼ばれていました。
scala - TraversableLike を独自のメソッドで拡張してライブラリを充実させる
独自のメソッドで TraversableLike を拡張しようとしましたが、失敗しました。
まず、私が達成したいことを見てください:
このコードは正常に機能し、リスト要素間の違いを計算します。Seq
しかし、Set
だけでなく などでも動作するようなコードが必要List
です。
私はこれを試しました:
いくつかのエラーがあります。暗黙の変換でも++-method
作業でもありません。また、新しいタイプの CC を作成する方法もわかりません。ループの呼び出しを参照してください。
scala - ある方法でScalaコレクションを充実させる
foreachWithIndex
Scalaコレクションにメソッドを追加するにはどうすればよいですか?
これは私がこれまでに思いついたものです:
これは機能しません:
次のエラーが発生します。
ただし、変換方法を明示的に適用すると、コードは機能します。
出力:
変換方法を明示的に適用せずに動作させるにはどうすればよいですか?ありがとう。
class - メソッドを暗黙的としてマークできるのに、コンストラクターとしてマークできないのはなぜですか?
一般的な Enrich-My-Library パターンは次のようなものです
implicit
このようにコンストラクター自体に追加することができないのはなぜですか
コンストラクターは、いくつかの追加の制限があるメソッドにすぎないと考えていますか?
驚くべきことに、以下は機能します。
scala - Scalaである既存のタイプから別の既存のタイプへの暗黙の変換を定義するにはどうすればよいですか?
使用するライブラリにクラスがあり、インスタンスが必要な場所でインスタンスが満たされるたびFoo
に、(コードファイル内の)Foo
インスタンスを暗黙的にインスタンスにキャストしたいとします。Scalaでこれを達成する方法は?String
Foo
String
scala - 既存の `toInt` メソッドのオーバーロード
のtoInt
メソッドはStringLike
引数を取らず、10 進数でのみ解析できます。そのため、バイナリ、16 進などを解析するには、Java の に頼る必要がありますInteger#parseInt(String s, int radix)
。
この状況を改善するために、次のことを試しました。
でも、
REPLコンパイラが「見事にクラッシュ」し、コンパイルされたコードでも機能しません。
「enrich my library」パターンを使用して既存のメソッドをオーバーロードする際に制限はありますか?
scala - 暗黙の順序付けを行うメソッドをscalaコレクションオブジェクトに追加する方法
暗黙の順序付けを使用したscalaコレクションメソッドでenrich-my-libraryパターンを利用しようとしています。
この定義を考えると:
このテストはどうしてですか?
このコンパイルエラーが発生しますか?
エラー:AnyVal {def getClass():java.lang.Class [_>:Int with Double <:AnyVal]}に対して暗黙の順序が定義されていません。val mx = List(1、2、7、1、4、8、2、5、47、2、7).myMinBy(_。toDouble)
scala - rich-my-library を使用した無名関数の型推論
(2 つの要素に対する関数) を (2 つのシーケンスに対する関数) に変換するメソッドがあるとします。
つまり、結果の関数は 2 つのシーケンスxs
とを取りys
、 で構成される新しいシーケンスを作成します。(xs(0) f ys(0), xs(1) f ys(1), ...)
たとえば、xss
isSeq(Seq(1,2),Seq(3,4))
とf
is(a: Int, b: Int) => a + b
の場合、次のように呼び出すことができます。
または無名関数で:
これはかなり良いです。型引数を取り除くのはいいことですが、[Int]
方法がわかりません (アイデアはありますか?)。
メソッドのように感じさせるためにtupled
、enrich-my-library パターンも試しました。
事前定義された関数の場合、これはうまく機能しますが、匿名の関数では醜いです
型が推論されるようにこれを再定式化できる別の方法はありますか?次のような構文を使用できます。
? それとも、型推論を求めすぎているのでしょうか?