問題タブ [implicits]

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 に答える
191 参照

scala - オーバーロードでジェネリック型paramがあるのに、scalaコンパイラが暗黙のパラメータ値/変換を見つけられないのはなぜですか?

Scala 2.8.1

次のクラス階層を取得します

以下sendのインスタンスを送信するときに、scalaコンパイラが暗黙のパラメータを見つけられないのはなぜですかB

routingKeyForの汎用バージョンの名前が変更されたときに、コンパイラが暗黙的なパラメータの値を見つけることができるのはなぜですか?

0 投票する
2 に答える
173 参照

scala - Scala での暗黙の変換の問題

Querydsl での Scala サポートを改善していますが、次の問題が発生しました。問題を示すコード スニペットを次に示します。

型引数に加えて、暗黙的な変換で型を一致させる方法。どちらかを個別に一致させることはできますが、両方を一致させることはできません。

0 投票する
2 に答える
453 参照

scala - Scala コレクションでの森林伐採

Scala のコレクションの設計から、次のようなことがわかります。

中間データ構造を構築しません。新しい Set は、BitSet が Builder を使用して繰り返されるときに構築されます。実際、その場合、文字列のビットセットは意味をなさないため、明らかです。

リストからのマップはどうですか? 以下が中間リストを作成することは間違いありません。

つまりリストList((1,foo), (2,foo), (3,foo))です。そうでない場合、どのように?では、以下はどうでしょうか。

今回は、のタイプから理解しているように見えるものから++

マップがその場で構築され、中間リストが構築されない場合があると思います。

そうですか?はいの場合、これは森林破壊を確実にする標準的な方法ですか、それとももっと簡単な構文がありますか?

0 投票する
5 に答える
7267 参照

scala - Scala依存性注入:暗黙的なパラメーターの代替

この質問の長さはご容赦ください。

多くの場合、コードの1つのレイヤーでコンテキスト情報を作成し、その情報を他の場所で使用する必要があります。私は通常、暗黙のパラメータを使用していることに気付きます。

これは機能しますが、暗黙のパラメーターを頻繁に渡す必要があり、介在する関数のレイアウト後にレイヤーのメソッドシグネチャを汚染します(それ自体は気にしない場合でも)。

このアプローチは醜いと思いますが、1つの利点があります。それはタイプセーフです。mog正しいタイプのコンテキストオブジェクトを受け取るか、コンパイルされないかは確実にわかっています。

何らかの形の「依存性注入」を使用して関連するコンテキストを見つけることができれば、混乱が緩和されます。引用符は、これがScalaで見られる通常の依存性注入パターンとは異なることを示すためにあります。

開始点fooと終了点mogは、システムの非常に異なるレベルに存在する場合があります。たとえばfoo、ユーザーログインコントローラーであり、mogSQLアクセスを実行している可能性があります。一度に多くのユーザーがログインしている可能性がありますが、SQLレイヤーのインスタンスは1つだけです。mog異なるユーザーによって呼び出されるたびに、異なるコンテキストが必要になります。したがって、コンテキストを受信オブジェクトにベイクすることはできません。また、2つのレイヤーを何らかの方法でマージすることもできません(ケーキパターンなど)。また、GuiceやSpringのようなDI/IoCライブラリに依存したくありません。私はそれらが非常に重く、Scalaにはあまり適していないことを発見しました。

したがって、私が必要だと思うのはmog、実行時に正しいコンテキストオブジェクトを取得できるものThreadLocalで、スタックが含まれているようなものです。

しかし、非同期アクターがチェーンのどこかに関与するとすぐに、それは低下します。どのアクターライブラリを使用するかは関係ありません。コードが別のスレッドで実行されると、が失われThreadLocalます。

だから...私が見逃しているトリックはありますか?介在するメソッドシグネチャを汚染せず、コンテキストをレシーバーに静的に焼き付けず、タイプセーフな情報をScalaでコンテキスト的に渡す方法はありますか?

0 投票する
3 に答える
1762 参照

scala - Scala では、型パラメーター T が Int (または Float、または...) からの暗黙的な変換をサポートしていることを抽象基本クラスにどのように伝えるのですか?

C++/テンプレートの世界から scala に移行するのに苦労しています。T をインスタンス化するために使用するものがそれらの操作をサポートしている限り、必要なテンプレート パラメーター T に対して任意の操作を使用できることに慣れています (基本的にコンパイル時のダック タイピング)。単一の型パラメーターを持つ抽象クラスを定義できるようにし、型 T の特定のインターフェイスを期待する対応するイディオムを Scala で見つけることができません。

私が持っているものはほとんど機能しますが、T が Int からの変換/構築をサポートしていることを抽象クラス (Texture[T <: Summable[T]]) に伝える方法がわかりません。T が変換をサポートしていることを Texture が認識できるように、トレイト Summable に暗黙的な変換を追加するにはどうすればよいですか?

0 投票する
3 に答える
1245 参照

scala - Scala の名前付き引数とデフォルト引数を暗黙のパラメーターと組み合わせて使用​​する

次の点を考慮してください。

最後の式により、次のエラーが発生します。

ただし、暗黙的なパラメーター a に既定値を指定しても問題はありません。

しかし、最後の行は印刷されます

私が期待していたであろう間

したがって、暗黙の値「s」は取得されません。代わりに f にパラメータを指定せず、単に呼び出す場合

次に、暗黙の値が取得され、取得します

誰かがここで何が起こっているのかを明らかにできますか?

0 投票する
6 に答える
1371 参照

java - Scala で既存の Java クラスにファクトリ メソッドを追加する方法

純粋な Scala 環境では、ファクトリ メソッドを既存のオブジェクトに「追加」したい場合、次のようにできます。

このような機能は、既存の Java クラスと組み合わせて使用​​する必要があります。私の具体的な例ではfromLocation、クラスにファクトリ メソッドを追加したいcom.google.android.maps.GeoPointと思います (そして、すべての Android 開発者は、これが役立つ理由を知っていると思います ;-) )。

ただし、次のようなことをしようとすると

エラーが表示されます

型の不一致; 見つかった: com.google.android.maps.GeoPoint.type (基になる型オブジェクト com.google.android.maps.GeoPoint を使用) 必須: AnyRef

したがって、上記のアプローチを実装する方法があるかどうか、またはaが必要なときにいつでも a を使用できるように、からの暗黙的な変換を Scala で推奨される方法でLocation提供するかどうか疑問に思います。GeoPointLocationGeoPoint


コメントで要求されているように、使用シナリオ:

ただし、これは一般的な問題の具体例の 1 つにすぎないことに注意してください ;-)

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

scala - メソッド対関数および Scala の暗黙関数

def と同等の関数を val として宣言しましょう。

なぜこれがうまくいかないのでしょうか?

これらの両方が行う間?

Option は GenTraversableOnce のサブタイプではないため、これは Implicit と関係があるに違いないと思いますが、それが正確に何であるかはわかりません。Scala 2.9.1 を使用しています。

0 投票する
2 に答える
1114 参照

scala - コンパニオンオブジェクトのScala暗黙的Numeric[T]

私は次の一般的なインターバルクラスを持っています(ユーザーsocによって親切に作成されました):

典型的なユースケース:Interval[Double]またはInterval[Int]。バイナリ和集合演算子と共通(implicit num: Numeric[T])部分演算子を追加するために、コンパニオンオブジェクトと同様のパターンに従いました。

(implicit num: Numeric[T])import num.mkOrderingOps両方のメソッドの内部をコピーするのは醜い定型文です。Intervalオブジェクト自体のレベルで、これを1回だけ実行する方法はありますか?

0 投票する
5 に答える
443 参照

scala - ステートメントに Scala Option と通常の変数を混在させる

透過的に Scala オプションと通常の変数を組み合わせた条件文を書きたいと思います。例えば:

もちろん、私は書くことができました

しかし、私はよりクリーンな構文を好むでしょう。

ヒントはありますか?'Option' を演算子で展開するか、暗黙的または圏論などを使用する必要がありますか?

EDIT : 宣言を修正しました。