2012-03-25 17 views
33

Nhìn vào ví dụ này:Làm cách nào để hiển thị đối số của hàm tạo Scala là thành viên công khai?

class Point(x: Double, y: Double){ 
    override def toString = "x: " + x + ", y: " + y 
    def +(sourcePoint: Point) : Point = { 
    return new Point(x + sourcePoint.x, y + sourcePoint.y 
    } 
} 

Như bạn có thể thấy tôi muốn xác định một phương pháp + điều hành trên lớp Point. Nhưng điều này sẽ không làm việc vì trong phương pháp đó, xy không thể truy cập vào các biến địa phương sourcePoint vì chúng là tư nhân, vì vậy tôi đã thay đổi ví dụ thành này:

class Point(_x: Double, _y: Double){ 
    var x = _x 
    var y = _y 

    override def toString = "x: " + x + ", y: " + y 
    def +(sourcePoint: Point) : Point = { 
    return new Point(x + sourcePoint.x, y + sourcePoint.y) 
    } 
} 

Đó rõ ràng là làm việc, tuy nhiên là có một cách dễ dàng hơn để xác định các biến này thay vì đi từ _x -> x và _y -> y.

Cảm ơn sự giúp đỡ và thời gian! :)

+5

Khi bạn viết 'điểm lớp (x: Double, y: Double)', 'x' và' y' chỉ là tham số cho hàm tạo chính, không được đệ trình trong lớp. Để tạo các trường của lớp, bạn cần 'val' hoặc' var'. – markmarch

+0

Aight, cảm ơn! Có vẻ như bây giờ là haha;) – user1285925

+1

Đây là một chút OT, nhưng không sử dụng trả về rõ ràng trong phương pháp '+' của bạn, trả về rõ ràng trong scala được dịch sang một ngoại lệ được ném và bắt trực tiếp và sau đó kết quả được trả về. Chỉ sử dụng điều này để thoát khỏi đóng cửa. – drexin

Trả lời

58

Vâng, đó là:

class Point(val x: Int, val y: Int) 
+1

Tôi cảm thấy xấu hổ. Tôi nên làm bài tập về nhà của tôi tốt hơn làm thế nào tôi có thể bỏ qua điều này: P – user1285925

+0

@ user1285925 Nếu bạn muốn giữ bí mật 'x' và' y', bạn cần thêm 'private' trước mỗi' val' trong danh sách đối số constructor. –

+0

@LeifWickland Có lý do nào để khai báo 'private val' trong danh sách đối số không? Bạn có thể bỏ nó ra và trình biên dịch biến nó thành một trường nếu cần thiết. –

3

sử dụng val là hợp lệ nhưng sau đó các thông số trở thành cuối cùng (không đổi). Thay vào đó, nếu bạn muốn gán lại giá trị, bạn nên sử dụng var. Vì vậy,

class Point(var x: Int, var y: Int) 
Các vấn đề liên quan