2012-07-20 21 views
6

Tôi gặp phải điều này trong cả hai Groovy 1.8.6 và 2.0.0.Thêm đóng cửa curried làm tài sản tĩnh với expando metaclass mất giá trị tham số mặc định

Vì vậy, các kịch bản tất cả các công việc như mong đợi:

def ay = { one, two=[:] -> [one, two] } 
def be = { one, two, three=[:] -> [one,two,three] } 
def ayprime = ay.curry('PRIME') 
def beprime = be.curry('PRIME') 
def beprimer = be.curry('PRIME', 'PRIMER') 

assert ay(1,2) == [1,2] 
assert ay(1) == [1,[:]] 
assert be(1,2,3) == [1,2,3] 
assert be(1,2) == [1,2,[:]] 

assert ayprime(1) == ['PRIME', 1] 
assert ayprime() == ['PRIME', [:]] 
assert beprime(1,2) == ['PRIME', 1, 2] 
assert beprime(1) == ['PRIME', 1, [:]] 
assert beprimer(1) == ['PRIME', 'PRIMER', 1] 
assert beprimer() == ['PRIME', 'PRIMER', [:]] 

Như thực hiện điều này:

class Klass { 
    static def smethod = { one, two=[:] -> [one, two] } 
} 
assert Klass.smethod(1,2) == [1, 2] 
assert Klass.smethod(1) == [1, [:]] 

này cũng làm việc, như mong đợi:

Klass.metaClass.static.aymethod << ay 
assert Klass.aymethod(1) == [1, [:]] 

Tham số mặc định để đóng cửa chưa được kiểm soát sẽ tiếp tục chuyển nhượng cho Klass.

Tuy nhiên, này không thành công:

Klass.metaClass.static.ayprimemethod << ayprime 
assert Klass.ayprimemethod() == ['PRIME', [:]] 

thusly:

assert Klass.ayprimemethod() == ['PRIME', [:]] 
      |    | 
      [PRIME, null] false 

và tương tự, điều này không:

Klass.metaClass.static.beprimermethod << beprimer 
assert Klass.beprimermethod() == ['PRIME', 'PRIMER', [:]] 

thusly:

assert Klass.beprimermethod() == ['PRIME', 'PRIMER', [:]] 
     |    | 
     |    false 
     [PRIME, PRIMER, null] 

Với đóng cửa đã đóng, giá trị tham số mặc định hoạt động trực tiếp, nhưng bị mất khi đóng được gán làm thành viên tĩnh của Klass.

Điều này có vẻ như như một lỗi. Tôi không thể tìm thấy hành vi này được ghi lại ở bất cứ đâu. Tui bỏ lỡ điều gì vậy?

+0

Tôi thấy cùng một hành vi. Tôi cũng đã thử nghiệm nó như là một phương thức lớp-instance (vì vậy nó có thể được kiểm tra thông qua 'Klass.metaClass.ayprimemethod << ayprime; khẳng định new Klass(). Ayprimemethod() == ['PRIME', [:]]'), và tìm thấy cùng một vấn đề. Có vẻ như bạn nên [nộp lỗi trong JIRA] (http://jira.codehaus.org/secure/BrowseProject.jspa?id=10242). – OverZealous

+0

Xong. http://jira.codehaus.org/browse/GROOVY-5621 –

+0

Cảm ơn bạn đã giải thích về cách làm currying :) –

Trả lời

0

Nếu vấn đề vẫn còn làm phiền bạn, tôi nghĩ rằng điều này có thể là một cách giải quyết, cho đến khi nó được cố định trong thân cây groovy. Cách python để cà ri công cụ:

def ayprime = { x -> x ? ay('PRIME', x) : ay('PRIME') } 
def beprime = be.curry('PRIME') 
def beprimer = { x -> x ? be('PRIME', 'PRIMER', x) : be('PRIME', 'PRIMER') } 
Các vấn đề liên quan