2010-08-23 20 views
7

Cố gắng tìm ra cách quá tải dấu ngoặc đơn trên một lớp học.Tôi có thể quá tải dấu ngoặc đơn trong Scala không?

tôi có mã này:

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

Tôi muốn để có thể truy cập vào các giá trị Bản đồ theo cách này:

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

Đây có phải là có thể?

Trả lời

19

Bạn cần xác định phương thức apply.

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

Như những người khác đã lưu ý, bạn muốn quá tải apply:

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

Trong khi bạn đang ở đó, bạn có thể muốn quá tải đối tượng đồng hành cũng áp dụng:

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

Sau đó, bạn có thể:

scala> App(Map("1" -> "2")) // Didn't need to call new! 
res0: App = [email protected] 

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

mặc dù đây là lợi ích hay nhầm lẫn sẽ tùy thuộc vào những gì bạn đang cố gắng làm.

9

Để hoàn chỉnh, bạn nên nói rằng "áp dụng" có thể nhận nhiều giá trị và "cập nhật" hoạt động dưới dạng "áp dụng", cho phép "ngoặc quá tải" ở phía bên tay trái của các bài tập

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 

Giá trị chính của tất cả điều này là nó giúp mọi người không đưa ra cú pháp bổ sung cho những thứ phải được đặt biệt trong ngôn ngữ C-family trước đó (ví dụ: phân bổ và tìm nạp phần tử mảng). Nó cũng tiện dụng cho các phương thức nhà máy trên các đối tượng đồng hành. Ngoài ra, hãy cẩn thận, vì đó là một trong những điều có thể dễ dàng làm cho mã của bạn quá nhỏ gọn để thực sự có thể đọc được.

+0

Cảm ơn! Rất hữu dụng – Joshua

Các vấn đề liên quan