0

Scalaでジェネリック演算子を定義することは可能ですか?

Scalaを使用すると、関数に任意の演算子をマップできます。これは非常に便利です。ただし、アプリケーションの状態に応じて演算子を変更したい場合は、制限があるようです。


例を挙げると、ユーザーのテーブルとそれぞれの関係のテーブルがあります。それぞれの関係には、「friends-with」、「works-with」などのタイプがあります。私のドメインモデルに基づいて、DSLで次のことを許可したいと思いますis(john friends-with mary)。この場合、johnmaryは両方ともObjectUserであり、汎用演算子がありdef <relationship> (a:User): Boolean = {...}ます。


私が達成したかったのは、まさにDynamicが私にできることでした(答えを参照)。説明は完全に一致します:

動的な呼び出しを可能にするマーカー特性。このトレイトのインスタンスxでは、任意のメソッド名methおよび引数リストargsに対してx.meth(args)を呼び出すことができます。呼び出しがxでネイティブにサポートされていない場合は、x.applyDynamic( "meth"、args)に書き換えられます。

詳細はこちら:http ://www.scala-lang.org/api/current/scala/Dynamic.html

4

1 に答える 1

4

Scala 2.10で利用できるようになる特性Dynamicを見てください(Scala 2.9で実験的です)。

例えば:

scala> :paste
// Entering paste mode (ctrl-D to finish)

case class User(name: String) extends Dynamic {
  def applyDynamic(relationship: String)(to: User) =
    Relation(relationship, this, to)
}
case class Relation(kind: String, from: User, to: User)

// Exiting paste mode, now interpreting.

defined class User
defined class Relation

scala> User("john") friendsWith User("mary")
res0: Relation = Relation(friendsWith,User(john),User(mary))
于 2012-07-09T01:03:57.593 に答える