试图找出如何在类上重载括号。
我有这段代码:
class App(values: Map[String,String])
{
// do stuff
}
我希望能够以这种方式访问值:
var a = new App(Map("1" -> "2"))
a("1") // same as a.values("1")
这可能吗?
答案 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?