問題タブ [scala-reflect]

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

scala - WeakTypeTag リフレクション + quasiquoting との型パラメーターの不一致 (と思います!)

travisbrownに触発されて、マクロを使用して「スマートコンストラクター」を作成しようとしています。

与えられた

マクロは、 のすべてのサブクラスを見つけHello、それらのコンストラクターを調べ、いくつかの要素を抽出して、「スマート コンストラクター」用にこのツリーを設定する必要があります。

私は得たいと思っていました:

代わりに次を取得します。

一見すると、ツリーは問題ないように見えます。

しかし、目に見えないほどではないと思います。単純に typeParams をinfo.typeParams.map(p => TypeName(p.name.toString))で更新しようとすると、準引用を行うときに「型パラメーターとして A をスプライスできません」というメッセージが表示されます。

どこが間違っていますか?ご覧いただきありがとうございます。

-アリア

PS私はこの記事に従ってtoolbox.untypecheck/typecheckを試してきましたが、機能する組み合わせは見つかりませんでした。

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

scala - Scala リフレクション: Function1 の apply メソッドの呼び出し - 複数の選択肢?

v2.11.6 で scala リフレクション API を使用して関数を呼び出そうとしています:

使用すると、 onref.reflectMethod(apply.asMethod)の複数の代替案について不平を言います。調べると、2 つの方法が明らかになります。1 つは署名付きで、もう1 つは. 通話中applyrefapply.asTerm.alternatives(x$1: Int)Int(v1: T1)R

(2 番目の選択肢を使用) は、正しい結果 (3) を返します。ただし、最初の選択肢を呼び出すと例外が発生します。java.lang.IllegalArgumentException: object is not an instance of declaring class

それらの代替手段は何ですか?また、常に適切な代替手段を呼び出すようにするにはどうすればよいですか? この方法で Function2 以上を呼び出すことにも問題があるようですが、正しい方法は何ですか?

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

scala - Scala の MethodMirror インスタンスからメソッドの関数型を取得する

MethodMirrorオブジェクトの特定のメソッドに対して作成されたインスタンスがあるとします。ミラーのフィールドによって、メソッドの戻り値の型とパラメーターに簡単にアクセスできます。しかし、実際には、このメソッドが関数として持つ型を取得する必要があります。

これは、私が達成したいことを説明するのに役立つおもちゃのコード例です。Scala 2.11.6 を使用しています。

関数を表すTypeからインスタンスを生成したいと思います。methodMirrorこの例では、 である必要があります(String, String) => IntFunctionX具体的な Scala のクラスにあまり依存しないソリューションが望ましいと思います。

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

scala - サブクラスで typeOf[this.type] を取得する

スーパークラスが具体的なインスタンスの型にアクセスできるようにするにはどうすればよいでしょうか?

つまり、Base.t はインスタンスの具体的な型を反映する必要があるという考えです...

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

scala - Scala リフレクション - Java 列挙型ジェネリック オブジェクト

私は Scala 2.10 を使用しており、Java 列挙型の逆シリアル化のための一般的な方法に従うのに苦労しています。

私が得ているエラーメッセージは次のとおりです。

これは明らかですが、正しく解決する方法がわかりません。誰かが私にヒントを与えることができますか?

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

scala - マルチプロジェクト SBT ビルドの不正なシンボリック参照 scala-reflect ランタイム

私は、古い ant ビルド スクリプトを SBT に書き直すという任務を負っています。たまたま、私たちのスイートは 3 つのモジュールで構成されています。

  • Play 2.3 フロントエンド Web サーバー。
  • 他のさまざまなシステムからデータを取得するためのバックエンド。
  • データベース アクセスおよびビジネス ロジック用のいくつかの共有クラスを含む中間モジュール。

Build.scala ファイルの抜粋を以下に示します。

ただし、ソースをコンパイルしようとすると、次のエラーが発生します。

クラス ファイル 'ValueConverter.class' で見つかった scala.reflect.runtime への不正なシンボリック参照。パッケージ scala.reflect の用語ランタイムにアクセスできません。現在のクラスパスに scala.reflect.runtime の定義がないか、現在のクラスパスにあるバージョンと互換性のないバージョンに対して ValueConverter.class がコンパイルされている可能性があります。

ソース コードは、次の構造で構成されています。

  • 戻る
    • ソース
    • テスト
    • ライブラリ
  • 真ん中
    • ソース
    • テスト
    • ライブラリ
  • フロント
    • ソース
    • テスト
    • ライブラリ

ここで、各 lib フォルダーには、手動で管理されたライブラリがいくつか含まれています (これが、sbt に移動したい理由です)。

これを解決する方法についてのアイデアはありますか?

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

scala - 複数のジェネリック型と 1 つのジェネリック作業単位を持つ Scala Fork-Join-All

複数のジェネリック型を受け入れ、実行する作業単位を引数として取るメソッドを作成しようとしています。

作業単位は、それ自体が一般的な共通関数であるという考え方です。例として、次のようなものだとしましょう。

loadModelRdd() は、モデル情報のロードなどの内部処理の後に、指定されたタイプの RDD を構築します。

私がハッキングしてきたプロトタイプ メソッドは、次のようなものです (動作していません)。

これは私が取り組んでいるコードの短縮版です。実際には 10 もの異なる型を受け入れることを検討しています。

ご覧のとおり、forkAll メソッドの全体的な目標は、Future で作業単位をラップし、タイプごとに作業単位の実行を fork-join し、結果を Tuple された結果として返すことです。消費者ステートメントの例は次のとおりです。

つまり、この時点で fork-join して結果を待ちたいのですが、実行を並行して実行してからドライバー (具体的には Spark ドライバー) に戻してほしいと考えています。

問題は、Future {} ブロックを構築するときに forkAll 内の作業単位によって返される型を強制する方法がわからないことです。forkAll がない場合、実装は次のようになります。

私は2つの理由でこれを行うことを検討しています:

  1. このモデルに一致する作業単位の fork-join の詳細を抽象化します。
  2. 作業単位が何であるかを明示的に示すこのコードのバージョンは、本番環境で機能しており、長時間実行されるブロックの実行を半分近く削減する役割を果たしていました。このパターンを適用できる実行ステップがいくつかあります

これは Scala の型システムで可能なことですか? それとも、この問題を別の視点から見る必要がありますか? 私はいくつかの実装を試しました (ここで説明されている実装を含む) が、問題に対する現在の見解に適合するものを見つけることができませんでした

追加情報が必要な場合はお知らせください。

ありがとう!