0

是否可以在 Scala 中定义泛型运算符?

Scala 让我可以在函数上映射任意运算符,这非常有用。但是,在我可能希望操作员根据应用程序的状态进行更改的情况下,这似乎具有限制性。


举个例子:我有一个包含用户的表和一个包含他们各自关系的表。每个关系都有一个类型,例如:“friends-with”、“works-with”等。根据我的领域模型,我希望 DSL 允许:is(john friends-with mary). 在这种情况下,johnmary都属于 Object User,它有一个通用的 operator 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

查看 trait Dynamic,它将在 Scala 2.10 上可用(它在 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 回答