2011-10-19 24 views
7

Hãy nói rằng tôi có hai phương pháp định nghĩa có cùng tên và trở lại, nhưng params khác nhau:Tôi có thể lấy hàm từ phương thức quá tải trong scala không?

def overload(x: Int) = x.toString 
def overload(s: String) = s 

Bây giờ tôi muốn chuyển đổi một trong số họ để một hàm. Nếu phương pháp không bị quá tải, tôi sẽ thực hiện việc này:

val f = overload _ 

Nhưng vì trình biên dịch phải phàn nàn đúng về tham chiếu mơ hồ. Có cách nào để thực hiện một chức năng của một hoặc khác của các phương pháp quá tải khác hơn là đổi tên một trong số chúng?

Cảm ơn!

John

Trả lời

15

Cách trình biên dịch biết mà overload để gọi khi bạn gọi nó là trực tiếp là bằng cách biết kiểu lập luận nó được áp dụng. overload someInt chỉ có thể đề cập đến overload(x: Int), do đó không có sự mơ hồ.

Khi bạn thực hiện một hàm từ nó, bạn chưa cung cấp đối số, vì vậy trình biên dịch không biết bạn muốn hàm của bạn là gì, vì vậy nó không biết bạn đang giới thiệu overload nào đến.

Cách đơn giản để khắc phục điều đó là rõ ràng cho nó trở thành loại:

val f : Int => String = overload _ 

hay:

val f = (x : Int => overload x) 

hay:

val f = overload (_ : Int) 

(lưu ý: Tôi có không đã thử nghiệm những điều này, nhưng một số biến thể trên chúng sẽ hoạt động)

+0

Cảm ơn Ben. Tôi sẽ cung cấp cho họ một spin. – jxstanford

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