2010-01-18 36 views
18

Tôi biết bạn có thể tạo ra một chức năng ẩn danh, và có trình biên dịch suy luận kiểu trả về của nó:Có thể chỉ định kiểu trả về của hàm ẩn danh, trong Scala không?

val x =() => { System.currentTimeMillis } 

Chỉ vì lợi ích tĩnh gõ của, là nó có thể để xác định lợi nhuận của nó gõ không? Tôi nghĩ rằng nó sẽ làm cho mọi thứ rõ ràng hơn rất nhiều.

Trả lời

27

Theo ý kiến ​​của tôi nếu bạn đang cố làm rõ hơn thì tốt hơn là ghi lại kỳ vọng vào mã định danh x bằng cách thêm chú thích kiểu ở đó chứ không phải kết quả của hàm.

val x:() => Long =() => System.currentTimeMillis

Sau đó trình biên dịch sẽ đảm bảo rằng chức năng ở phía bên phải đáp ứng kỳ vọng đó.

+0

Không chắc chắn ý của bạn với * rằng chức năng ở phía bên trái đáp ứng kỳ vọng đó *, việc đặt loại cho khối kết quả cũng đảm bảo rằng loại đó là chính xác, ví dụ: 'val x =() => {System.currentTimeMillis}: Chuỗi' không biên dịch. Hay bạn ám chỉ điều gì khác? –

+0

Câu trả lời của Geoff có lợi thế là bạn có được loại hình đầy đủ ở phía trước. Nếu bạn có định nghĩa hàm dài (nhiều dòng), hãy nhanh nhất để hiểu những gì đang xảy ra nếu loại đó ở đầu. Câu trả lời của Fabian có lợi thế là ít lặp đi lặp lại (đặc biệt tốt cho các định nghĩa ngắn (một dòng), và nhanh hơn để hiểu nếu bạn có thể mò mẫm toàn bộ điều trong nháy mắt). –

+0

Ồ, bây giờ tôi thấy điểm của Geoff, định nghĩa kiểu của nó chứa kiểu đầu vào, ở đây là '()', và được kiểm tra khi hàm '() => System.currentTimeMillis' được gán cho' x'. –

37
val x =() => { System.currentTimeMillis } : Long 
+0

Việc này đã giải quyết được sự cố của tôi. Điều này làm cho tiết kiệm hơn rất nhiều so với cách sử dụng phương pháp Function #. –

+0

có vẻ như 'val x =() => Long = {blah}' sẽ là một cú pháp trực quan hơn. Cảm ơn câu trả lời! – wbarksdale

9

Fabian đã đưa ra cách đơn giản, nhưng một số cách khác nếu bạn thích quản lý vi mô đường bao gồm:

val x = new (() => Long) { 
    def apply() = System.currentTimeMillis 
} 

hoặc

val x = new Function0[Long] { 
    def apply() = System.currentTimeMillis 
} 

hoặc thậm chí

val x = new { 
    def apply(): Long = System.currentTimeMillis 
} 

vì trong hầu hết các tình huống nó không có sự khác biệt nếu nó hạ xuống từ Function, chỉ cho dù nó có áp dụng hay không.

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