2013-06-15 37 views
7

Giá trị mặc định của tham số có thể tham chiếu một thông số khác như thế nào? Nếu nó không thể, làm thế nào để làm việc xung quanh đó?Giá trị mặc định của tham số có thể tham chiếu một thông số khác như thế nào?

case class A(val x:Int, val y:Int = x*2) 

Lỗi (hợp lý đủ):

scala> case class B(val x:Int, val y:Int = x*2) 
<console>:7: error: not found: value x 
    case class B(val x:Int, val y:Int = x*2) 
            ^

Trả lời

11

này yêu cầu bạn sử dụng nhiều danh sách tham số:

case class A(x: Int)(y: Int = x*2) 

Mặc định giá trị chỉ có thể tham khảo các thông số trong danh sách trước.

Hãy tuy nhiên cẩn thận với trường hợp các lớp học, bởi vì bình đẳng của họ chỉ đưa vào tài khoản trong danh sách tham số đầu tiên, do đó:

A(1)() == A(1)(3) // --> true!! 
+1

Câu trả lời hay. Đó là khá khó hiểu khi sử dụng các trường hợp lớp, và nó vẫn không cố định như của 2.11.6. –

+0

Thực ra, tôi coi đó là một tính năng hữu ích để có thể xác định các thông số không tham gia vào sự bình đẳng và băm. –

6

Kể từ khi bạn yêu cầu các công việc xung quanh, nếu nó không rõ ràng làm thế nào để giữ gìn caseness :

scala> :pa 
// Entering paste mode (ctrl-D to finish) 

case class Foo(x: Int, y: Int) 
object Foo { 
    def apply(x: Int): Foo = apply(x, 2*x) 
} 

// Exiting paste mode, now interpreting. 

defined class Foo 
defined object Foo 

scala> Foo(5,6) 
res45: Foo = Foo(5,6) 

scala> Foo(5) 
res46: Foo = Foo(5,10) 
+0

Tôi thấy phương pháp này hữu ích hơn, nhưng tôi cho 0__ trả lời sự chấp nhận, bởi vì nó có vẻ phổ biến hơn. –

+0

Trên thực tế, kiểm tra màu xanh lá cây được cho là có nghĩa là những gì đã giải quyết được vấn đề của bạn, tuy nhiên bạn xác định điều đó. Nhưng tôi đoán bạn đã giải quyết được vấn đề của mình vài năm trước. –

+0

Vâng, nhìn lại, tôi không biết tại sao tôi chuyển sang kiểm tra màu xanh lá cây. –

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