Đoạn mã sau được lấy từ Lập trình trong sách Scala của Martin Odersky et al. xác định một loại hợp lý:Có thể định nghĩa biến hàm dựng trong Scala không?
class Rational(n: Int, d: Int) {
require(d != 0)
private val g = gcd(n.abs, d.abs)
val numer = n/g
val denom = d/g
...
private def gcd(a: Int, b: Int): Int = if (b == 0) a else gcd(b, a % b)
}
Ở đây giá trị g chỉ được sử dụng khi hàm tạo ngầm ngầm khởi tạo trường số và denom. Giả sử người lập trình biết rằng nó sẽ không được sử dụng ở bất cứ nơi nào khác. Trong trường hợp trên, nó vẫn có thể truy cập được sau khi xây dựng đối tượng Rational. Điều đó có nghĩa là nó cũng sẽ chiếm không gian kể từ khi là một trường riêng thay vì là một biến cục bộ cho hàm tạo.
Câu hỏi của tôi là làm cách nào để thay đổi mã này để g
chỉ được sử dụng khi xây dựng và sau đó bị vứt bỏ?
Đây là một trong những "điểm nóng" trong Scala. Hãy tưởng tượng rằng nếu đối tượng constructor đã cho chỉ được sử dụng để trích xuất một số thông tin tùy ý: có nó xung quanh mãi mãi sẽ giữ cho nó không đủ điều kiện để cải tạo ngay cả khi chỉ cần một nhóm nhỏ thông tin. Tôi nghĩ rằng có một cú pháp "cơ thể trước lớp", nhưng tôi không thể nhớ nó là gì. –
@pst Cảm ơn bạn đã chỉnh sửa nhanh trong thời gian này. Của bạn trông tốt hơn mặc dù. :) – ciuncan
Nếu có ai có bất kỳ liên kết nào liên quan đến cú pháp "tiền thân lớp" này, đề cập đến pst, tôi muốn được nghe về nó. –