2012-02-23 30 views
11

xem xét như sau:Scala đặt tên và đối số mặc định kết hợp với các thông số ngầm

def f(implicit a: String, y: Int = 0) = a + ": " + y 
implicit val s = "size" 
println(f(y = 2)) 

Biểu thức cuối cùng gây ra các lỗi sau:

not enough arguments for method f: (implicit a: String, implicit y: 
Int)java.lang.String. Unspecified value parameter a. 

Tuy nhiên, nếu bạn cung cấp một giá trị mặc định cho tiềm ẩn thông số a, không có vấn đề:

def f(implicit a: String = "haha!", y: Int = 0) = a + ": " + y 
implicit val s = "size" 
println(f(y = 2)) 

Nhưng dòng cuối cùng in s

haha!: 2 

trong khi tôi lại có thể ngờ

size: 2 

Vì vậy, giá trị tiềm ẩn 's' không nhặt. Nếu bạn thay vì không cung cấp bất kỳ thông số f và chỉ cần gọi

println(f) 

thì giá trị tiềm ẩn được nhặt và bạn nhận

size: 0 

Ai đó có thể làm sáng tỏ về những gì đang xảy ra ở đây?

Trả lời

15

Hãy thử

println(f(y = 2, a = implicitly)) 

Khi bạn bắt đầu xác định các thông số, bạn không thể quay lại. Đó là hoặc toàn bộ danh sách là tiềm ẩn hoặc không ai trong số đó là.

0

Dọc theo dòng gì jsuereth nói, bạn có thể xác định chức năng của bạn như

def f(a: String = implicitly, y:Int = 0) = a + ": " + y 

Hoặc theo cách tôi đã sử dụng hơn để nhìn thấy,

def f(y:Int = 0)(implicit a: String) = a + ": " + y 
+2

Bạn nên kiểm tra mà ngầm phạm vi mà ngầm đang sử dụng. Tôi không nghĩ nó giống như lựa chọn thứ hai. – jsuereth

4

thông số ngầm nên đi riêng - - đầu tiên, và ở phần cuối của định nghĩa phương thức - thứ hai. Như thế này:

def f(y: Int = 0)(implicit a: String) = a + ": " + y 
implicit val s = "size" 
println(f(y = 2)) 

ouputs

size: 2 
+0

Để sử dụng tham số mặc định đầu tiên phải gọi 'f()'. – raisercostin

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