2010-03-02 27 views
19

Mã bên trong bao đóng có thể tham chiếu đến biến số it.Đóng cửa lồng tiếng Groovy với việc sử dụng 'it'

8.times { println it } 

hoặc

def mywith(Closure closure) { 
    closure() 
} 

mywith { println it } 

Với hành vi này trong tâm trí bạn không thể mong đợi sau mã để in 0011

2.times { 
    println it 

    mywith { 
     println it 
    } 
} 

Và thay vào đó tôi phải viết

2.times { i -> 
    println i 

    mywith { 
     println i 
    } 
} 

Câu hỏi của tôi là: lý do tại sao đóng cửa mà không có tham số ghi đè it biến ngay cả khi họ không cần nó.

Trả lời

13

Tôi nghĩ rằng nó có cái gì để làm với formal Closure definition của Groovy:

đóng cửa có thể có 1 ... N lập luận, có thể được gõ tĩnh hoặc untyped. Tham số đầu tiên là có sẵn thông qua đối số không rõ ràng được đặt tên nếu không có đối số rõ ràng được đặt tên. Nếu người gọi không chỉ định bất kỳ đối số nào, tham số đầu tiên (và, theo tiện ích mở rộng, nó) sẽ không có giá trị.

Điều đó có nghĩa rằng một Groovy Đóng cửa sẽ luôn có ít nhất một đối số, gọi là (nếu không có quy định khác) và sẽ được null nếu không được đưa ra như một tham số.

Ví dụ thứ hai sử dụng phạm vi của bao đóng kèm theo.

+0

Cảm ơn định nghĩa chính thức –

19

Nếu bạn định nghĩa một kết thúc như thế này

def closure = {println "i am a closure"} 

Nó dường như không có tham số, nhưng thực sự nó có một tham số ngầm tên it. Đây là khẳng định:

def closure = {println "i am a closure with arg $it"} 
closure("foo") 

mà in

"tôi là một người đóng cửa với arg foo"

Nếu bạn thực sự muốn xác định một kết thúc mà có 0 thông số, sử dụng này :

def closure = {-> println "i am a closure"} 

Ví dụ của bạn do đó có thể được viết lại là:

2.times { 
    println it 

    mywith {-> 
     println it 
    } 
} 
+0

Cảm ơn. Rõ ràng không tham số-đóng cửa sẽ không nhìn tốt đẹp trong mini-dsls. –

+0

Vì vậy, tôi tin rằng trong trường hợp này biến 'it' được in trong' mywith' đóng lồng lồng nhau là [biến tự do] (http://groovy.codehaus.org/Closures#Closures-Freevariables). – TheAmpersand

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