2010-07-13 2 views
9

Giả sử tôi có một lớp đơn giản trong Scala:Làm cách nào để lấy các đối tượng Hàm từ các phương thức trong Scala?

class Simple { 
    def doit(a: String): Int = 42 
} 

Làm thế nào tôi có thể lưu trữ trong một val các Function2 [Đơn giản, String, Int] mà phải mất hai đối số (mục tiêu đối tượng đơn giản, lập luận String), và có thể gọi doit() đưa tôi trở lại kết quả không?

Trả lời

14
val f: Function2[Simple, String, Int] = _.doit(_) 
+1

Được gọi là "một phần ứng dụng". Như hiển thị ở đây là một trường hợp đặc biệt. Như tên cho thấy, một số đối số có thể được cung cấp trong ứng dụng một phần và hàm kết quả có Nity M trong đó N là hàm nguyên gốc (hoặc hàm) và M là số đối số được cố định trong ứng dụng một phần. –

+0

Hoàn hảo. Tôi đã tự hỏi làm thế nào trình biên dịch sẽ tìm ra liệu phương pháp doit thực sự tồn tại; Tôi thấy rằng gõ rõ ràng hiện các trick ở đây. Cảm ơn! –

12

giống như sepp2k, chỉ cần sử dụng một cú pháp

val f = (s:Simple, str:String) => s.doit(str) 
9

Đối với những người trong anh em mà không thưởng thức các loại gõ:

scala> val f = (_: Simple).doit _ 
f: (Simple) => (String) => Int = <function1> 

Sau một phương pháp mà theo _ công trình cho cho bất kỳ arity:

scala> trait Complex {       
    | def doit(a: String, b: Int): Boolean 
    | }          
defined trait Complex 

scala> val f = (_: Complex).doit _    
f: (Complex) => (String, Int) => Boolean = <function1> 

Điều này được bao gồm bởi sự kết hợp của §6.23 "Cú pháp chỗ dành cho hàm ẩn danh" và §7.1 "Giá trị phương thức" của Scala Reference

+0

Ý nghĩa thực tế của việc có một hàm kiểu (Simple) => (String) => Int so với kiểu (Simple, String) => Int là gì? Tôi biết trước đây được gọi với f (obj) ("str") và sau đó với f (obj, "str"), và sau đó trả về một đối tượng hàm khác nếu chỉ cần gọi nó với một danh sách tham số: f (obj). Nhưng điều gì xảy ra sau hậu trường về số đối tượng được tạo và số lần gọi phương thức? –

+0

Hai đối tượng Function1 chứ không phải một đối tượng Function2 được tạo ra, với một mức độ thêm vào là vô hướng. – retronym