2011-10-20 24 views
8

Tôi sẽ làm cho đối số hàm tạo thứ hai tùy chọn và sử dụng giá trị của đối số đầu tiên trong trường hợp đó. Có cách nào tôi có thể làm điều đó không? Mã này không biên dịch vì nó không thể tìm thấy realUser:Scala constructor với mặc định arg tham chiếu đến một arg

class CurrentUser(val realUser:String, val masqueradeUser:String = realUser) 

Tôi chắc rằng tôi có thể làm việc xung quanh nó bằng cách viết constructor của riêng tôi, nhưng tôi tự hỏi nếu có một cách ngắn gọn hơn. Trên thực tế bây giờ mà tôi đã cố gắng viết constructor của riêng tôi, nó không phải là xấu:

class CurrentUser(val realUser:String, val masqueradeUser:String) { 
    def this(realUser:String) = this(realUser, realUser) 
} 

Nếu ai đó có thể đưa ra một cái gì đó ngắn sau đó tuyệt vời, nếu không tôi sẽ gửi câu trả lời của riêng tôi.

Trả lời

5

Cảm ơn các đề xuất. Tôi nghĩ rằng tôi sẽ gắn bó với việc xác định các hình thức xây dựng thứ hai bằng tay. Ở đây nó như là một câu trả lời cho đầy đủ 'vì lợi ích.

class CurrentUser(val realUser:String, val masqueradeUser:String) { 
    def this(realUser:String) = this(realUser, realUser) 
} 
11

Tôi tin rằng giải pháp của bạn với hàm tạo phụ trợ là giải pháp tốt hơn. Tham số không hiển thị trong danh sách tham số riêng của nó, chỉ trong các thông số sau. Vì vậy, bạn sẽ phải làm

class CurrentUser(val realUser: String)(val masqueradeUser: String = realUser) 

và sau đó gọi với

new CurrentUser(real)() 

Không quá đẹp.

+0

Tuyệt vời - Tôi chưa bao giờ thực sự sử dụng nhiều danh sách tham số trước đây. Bạn nói đúng rằng có lẽ đây không phải là nơi để sử dụng chúng mặc dù :) – Nick

8

Bạn không thể sử dụng lại các thông số từ cùng một danh sách tham số làm đối số mặc định. giải pháp của didierd hoạt động, và có lẽ giải pháp của bạn với một nhà xây dựng thứ hai là thanh lịch nhất. Dưới đây là một lựa chọn thứ ba, trong đó sử dụng sợ hãi null:

scala> class CurrentUser(val realUser:String, _masqueradeUser: String = null) { 
    | val masqueradeUser = if (_masqueradeUser == null) realUser else _masqueradeUser 
    | } 
defined class CurrentUser 

scala> new CurrentUser("paul").masqueradeUser 
res1: String = paul 

scala> new CurrentUser("paul", "p").masqueradeUser 
res2: String = p 

Nếu bạn muốn tránh null, bạn có thể sử dụng Opt[A] lớp discussed here nếu bạn không nhớ các chi phí. Bằng cách này hay cách khác, tôi vẫn đi với giải pháp xây dựng thứ hai của bạn.

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