2010-09-24 33 views
17

Groovy có hỗ trợ bất kỳ loại ký pháp lặp lồng nhau nào không?Làm thế nào để bạn thực hiện các trình lặp lồng nhau trong groovy?

Trong ví dụ dưới đây, tôi muốn bằng cách nào đó lấy giá trị projectName, đến từ trình lặp bên ngoài, vào trong trình vòng lặp bên trong của tôi. Điều này có thể không lưu trữ trong một biến không? Trong ví dụ của tôi, tôi nhận được một lỗi runtuime rằng "dự án" không tìm thấy

it.myprojects.project.each{ 
    println("Project name: " + it.projectName) 
    it.myroles.role.each{ 
     Role role = new Role() 
      role.setName(project.projectName)//how do I get projectName here without storting it in a variable in the outer loop? 
    } 
} 

Trả lời

17

Nó cảm thấy như thế này nên làm việc:

it.myprojects.project.each{ project-> 
    println("Project name: " + project.projectName) 
    it.myroles.role.each{ 
     Role role = new Role() 
     role.setName(project.projectName) 
    } 
} 

Ngoài ra, bạn có thể tham khảo việc đóng cửa bên ngoài bằng cách sử dụng owner biến

it.myprojects.project.each{ 
    println("Project name: " + it.projectName) 
    it.myroles.role.each{ 
     Role role = new Role() 
      role.setName(owner.projectName) 
    } 
} 

Tuy nhiên, tôi không thấy một lý do cho iterating trên vai trò nếu tất cả các bạn dường như đang làm là tạo ra các cá thể mới của lớp Role. Có lẽ một cái gì đó như thế này sẽ đơn giản hơn:

it.myprojects.project.each{ 
    println("Project name: " + it.projectName) 
    it.myroles.role.size().times { 
     Role role = new Role() 
     role.setName(owner.projectName) 
    } 
} 
+0

+1 và được chọn để trả lời câu hỏi tôi đã hỏi – Derek

+0

Bạn cũng có thể chỉ định lớp của trình vòng lặp có tên của bạn nếu IDE của bạn không thể tìm ra, ví dụ: 'it.myprojects.project.each {Project project -> .. .' Đôi khi tôi muốn làm điều này để tự động hoàn thành và như vậy. Có thể cho rằng, điều này gây ô nhiễm mã của bạn không cần thiết cho lợi ích của IDE của bạn, nhưng nó có nếu bạn muốn nó. –

0
it.projectList.each {...} 

?

và điều này: http://groovy.codehaus.org/Looping.

Bạn lặp lại danh sách, không phải trên danh sách trong danh sách. Có vẻ như từ mã của bạn, bạn đang lặp lại điều trong danh sách.

+0

err, thats xấu của tôi về cú pháp .. tôi thực sự kéo này từ một tệp XML và tôi có một số thẻ gọi là "projectlist" và "rolelist" chỉ là trùng hợp ngẫu nhiên – Derek

+0

đã chỉnh sửa mã ngay bây giờ để không có sự nhầm lẫn nào – Derek

+0

@derek vẫn còn có sự cố không? Hãy kích hoạt trình gỡ lỗi yêu thích của bạn và xem dự án nào là ... aslo, tôi nhận thấy mã thông báo đầu tiên trong mã của bạn là 'it', vì vậy có vẻ như có một số nội dung đang diễn ra bên ngoài mã bạn đã đăng mà bạn có thể muốn chia sẻ. – hvgotcodes

26

Những biến số it này là không trình lặp, chúng là các thông số closure. Tên it không phải là viết tắt của "iterator", nó có nghĩa đen là "nó", được sử dụng như một tên mặc định cho các đóng tham số đơn. Tuy nhiên, bạn có thể sử dụng rõ ràng (và do đó khác nhau lồng nhau) tên như thế này:

it.myprojects.project.each{ project -> 
    println("Project name: " + project.projectName) 
    project.myroles.role.each{ role-> 
     Role r= new Role() 
     r.setName(project.projectName) 
    } 
} 

Thực ra, tôi muốn khuyên chống lại bằng cách sử dụng phương pháp each chút nào và sử dụng vòng lặp thực sự thay vì:

for(project in it.myprojects.project){ 
    println("Project name: " + project.projectName) 
    for(role in project.myroles.role){ 
     Role r= new Role() 
     r.setName(project.projectName) 
    } 
} 

này là tốt hơn vì các bao đóng làm cho mã khó khăn hơn nhiều để gỡ lỗi và cũng có khả năng chậm hơn. Và trong trường hợp này, không có bất kỳ lợi thế nào trong việc sử dụng các bao đóng.

+0

ah - điều đó gây nhầm lẫn. Mã này chắc chắn hoạt động nếu bạn tiếp tục sử dụng lại "nó" theo kiểu lồng nhau. Nó chỉ trở nên rõ ràng với tôi có một cái gì đó buồn cười xảy ra khi tôi đã cố gắng để làm cho một tham chiếu trở lại trước đó – Derek

+2

@ Derek: Có vẻ như bạn đang làm lập trình hàng hóa-cult, tức là cố gắng sử dụng cú pháp mà không hiểu nó có nghĩa là. Không có thắc mắc bạn đang bối rối. Bạn thực sự cần phải đọc trên bao đóng cho đến khi bạn hiểu rằng "mỗi" là một phương thức, không phải là một từ khóa ngôn ngữ, mã trong dấu ngoặc nhọn là một đóng được chuyển thành tham số cho phương thức, và "nó" là tham số ngầm của đóng cửa khi nó được gọi bởi từng phương pháp. –

+1

Tôi không thấy lý do tại sao một vòng lặp rõ ràng sẽ tốt hơn so với sử dụng mỗi phương pháp - đó là nhiều hơn một trường hợp của phong cách cá nhân và sở thích. – mfloryan

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