我可以在Scala中重载括号吗?

时间:2010-08-23 20:22:43

标签: scala

试图找出如何在类上重载括号。

我有这段代码:

class App(values: Map[String,String])
{
  // do stuff
}

我希望能够以这种方式访问​​值:

var a = new App(Map("1" -> "2"))
a("1") // same as a.values("1")

这可能吗?

4 个答案:

答案 0 :(得分:20)

您需要定义apply方法。

class App(values: Map[String,String]) {
  def apply(x:String) = values(x)
  // ...
}

答案 1 :(得分:9)

为了完整性,应该说你的“申请”可以采用多个值,“更新”作为“应用”的对偶,允许在作业的左侧“括号重载”

Class PairMap[A, B, C]{
   val contents: mutable.Map[(A,B), C]  = new mutable.Map[(A, B), C]();
   def apply(a:A, b:B):C = contents.get((a, b))
   def update(a:A, b:B, c:C):Unit = contents.put((a, b), c)
}

val foo = new PairMap[String, Int, Int]()
foo("bar", 42) = 6
println(foo("bar", 42)) // prints 6

所有这一切的主要价值在于它使人们不必为早期C系列语言中必须特殊的事物建议额外的语法(例如数组元素赋值和提取)。它对于伴随对象上的工厂方法也很方便。除此之外,应该注意,因为它是容易使你的代码过于紧凑而无法实际读取的东西之一。

答案 2 :(得分:5)

正如其他人已经指出的那样,你想重载apply

class App(values: Map[String,String]) {
  def apply(s: String) = values(s)
}

当你在它时,你可能想要重载伴侣对象也适用:

object App {
  def apply(m: Map[String,String]) = new App(m)
}

然后你可以:

scala> App(Map("1" -> "2"))  // Didn't need to call new!
res0: App = App@5c66b06b

scala> res0("1")
res1: String = 2

虽然这是好处还是混乱,取决于你想要做什么。

答案 3 :(得分:4)

我认为它可以使用apply:How does Scala's apply() method magic work?