Metodu

2010-12-10 36 views
9

metoduna ekle Groovy'de sadece metaclass programlama ile oynuyorum. Ama birden sadece çalışıyorum alınamadı küçük bir sorun ... İşte Metodu

basit script bakıyordu:

// 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() 

o yöntemi kullanmak mümkün mü ama arama ilk parametreyi ayarlayın nesne? temsilci kullanmak işe yaramıyor gibi görünüyor ... Arayanı başvurmayan yöntemleri atama sorun yok. Körüm burada mı çalışıyor?

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

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

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

idomatic yolu olacaktır kapanışları kullanmadan bir yöntem eklemek için:

sayesinde Ingo

cevap

14

Bunu gerçekleştirmek için en basit yolu şöyle bir kapatma yöntemi sarılmasıdır bir kategori sınıf oluşturmak ve böylece gibi karıştırmak:

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'" 
sana değer o bilmiyorum çünkü bu özel durumda yardımcı olabilir currying sanmıyorum

metaclass atama zamanında delege.

+0

Güzel. Teşekkürler. Bunu hiç düşünmemiştim ... Ayrıca bir sınıfa çok fazla statik yardımcı metodu eklemek için uygun bir yol var mı (kategoriye göre değil). Örneğin Apache Commons IO File File sınıfına dosya mı? – Ingo

+0

ah ... düzenlemeniz ayrıca ek sorumu yanıtlıyor. Tekrar teşekkürler. – Ingo

İlgili konular