2010-12-10 29 views
9

Tôi chỉ đang chơi với chương trình metaclass trong Groovy. Nhưng đột nhiên tôi đã phải đối mặt với một vấn đề nhỏ mà tôi chỉ có thể không được làm việc ...Thêm phương pháp vào metaclass

Đây là kịch bản đơn giản:

// define simple closure 
def printValueClosure = { 
println "The value is: '$delegate'" 
} 

String.metaClass.printValueClosure = printValueClosure 

// works fine 
'variable A'.printValueClosure() 



// define as method 
def printValueMethod(String s){ 
println "The value is: '$s'" 
} 

// how to do this!? 
String.metaClass.printValueMethod = this.&printValueMethod(delegate) 

'variable B'.printValueMethod() 

Có thể sử dụng phương pháp này nhưng thiết lập các tham số đầu tiên để kêu gọi vật? sử dụng đại biểu dường như không hoạt động ... Việc gán các phương thức không tham chiếu đến người gọi là không có vấn đề gì. Công việc cà ri có ở đây không?

Cảm ơn, Ingo

Trả lời

14

Cách đơn giản nhất để thực hiện điều này là để quấn phương pháp này trong một đóng cửa, như vậy:

def printValueMethod(String s){ 
    println "The value is: '$s'" 
} 

String.metaClass.printValueMethod = { -> printValueMethod(delegate) } 

assert 'variable B'.printValueMethod() == "The value is: 'variable B'" 

Cách idomatic để thêm một phương pháp mà không sử dụng đóng cửa sẽ được tạo một loại danh mục và trộn nó vào như vậy:

class PrintValueMethodCategory { 
    static def printValueMethod(String s) { 
     println "The value is: '$s'" 
    } 
} 

String.metaClass.mixin(PrintValueMethodCategory) 

assert 'variable B'.printValueMethod() == "The value is: 'variable B'" 

Tôi không nghĩ rằng việc nghiền có thể giúp ích trong trường hợp cụ thể này, vì bạn không biết giá trị o f các đại biểu tại thời điểm giao cho metaclass.

+0

Tốt. Cảm ơn. Không bao giờ nghĩ về điều đó ... Cũng có một cách thuận tiện để thêm nhiều phương thức trợ giúp tĩnh vào một lớp (không phải thông qua danh mục). Ví dụ Apache Commons IO FileUtils đến lớp tập tin? – Ingo

+0

ah ... chỉnh sửa của bạn cũng trả lời câu hỏi bổ sung của tôi. Cảm ơn một lần nữa. – Ingo

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