Rubyのものに似ています
4 に答える
はい、-Xexperimental
オプション付きの Scala 2.9 以降では、Dynamic
トレイト ( scaladoc ) を使用できます。拡張するクラスは、Ruby の のように動作Dynamic
する魔法のメソッドを取得します。applyDynamic(methodName, args)
method_missing
とりわけ、Dynamic
特性は JVM 上の動的言語とのインターフェースに役立ちます。
Dynamic
以下は、[実験的] Scala 2.9 で見つかったトレイトでは厳密には当てはまりません。たとえば、Kipton Barros からの回答を参照してください。
ただし、Dynamic
はまだ とはまったく異なりますがmethod_missing
、コンパイラの魔法を使用して、静的に決定された「欠落」メソッドへのメソッド呼び出しをプロキシ ( applyDynamic
) に効果的に書き換えます。method_missing
ポリモーフィズムの観点からそれを区別するのは、「欠落している」メソッドを静的に決定するアプローチです。真の動作を得るには、メソッドを動的に(たとえば、リフレクションを使用して)転送する必要があります。method_missing
(もちろん、これはサブタイプを避けることで回避できます:-)
いいえ、そのような概念は Java や Scala には存在しません。
Java と同様に、Scala のすべてのメソッドはコンパイル時に「バインド」されます (これにより、オーバーロードなどに使用されるメソッドも決まります)。プログラムがコンパイルされる場合、そのメソッドは存在します (またはコンパイラに従って実行されます)。それ以外の場合は存在しません。影響を受けるすべてのクラスを再構築せずにクラス定義を変更すると、 NoSuchMethodErrorが発生する可能性があるのはこのためです。
署名に準拠するオブジェクトでメソッドを呼び出そうとすること (「型付きダック タイピング」) が心配な場合は、おそらく構造型の型付けで回避できる可能性があります。Scala での構造型付けは、リフレクションに対する魔法のアクセスです。したがって、実行時まで「バインディング」を延期し、実行時エラーが生成される可能性があります。method_missing とは異なり、これはターゲットがエラーを処理することを許可しませんが、呼び出し元がエラーを処理できるようにします (そして、呼び出し元は理論的にターゲットで定義済みの methodMissing メソッドを呼び出すことができます... しかし、これはおそらく Scala にアプローチする最良の方法ではありません. Scala. Rubyではありません:-)
あまり。意味がありません。Scala は静的に型付けされた言語であり、コンパイル時にメソッドがバインドされます。Ruby は、メッセージがオブジェクトに渡される動的型付け言語であり、これらのメッセージは実行時に評価されます。これにより、Ruby は直接応答しないメッセージを処理できますmethod_missing
。
method_missing
Actors ライブラリを使用するなど、いくつかの方法で Scalaを模倣できますが、Ruby のmethod_missing
.
いいえ、これは Scala 2.8 以前では不可能です。