2012-05-23 37 views
6

Tôi đang đọc 'Groovy in Action' gần đây. Trong chương 7, nó đã giới thiệu *. nhà điều hành . Khi tôi chạy mã về nhà điều hành này, tôi nhận được một số sai lầm.Groovy *. Nhà điều hành

class Invoice {           
    List items           
    Date date           
}               
class LineItem {           
    Product product          
    int  count           
    int total() {           
     return product.dollar * count      
    }              
}               
class Product {           
    String name           
    def  dollar          
}               

def ulcDate = new Date(107,0,1) 
def ulc = new Product(dollar:1499, name:'ULC')   
def ve = new Product(dollar:499, name:'Visual Editor') 

def invoices = [           
    new Invoice(date:ulcDate, items: [     
     new LineItem(count:5, product:ulc),    
     new LineItem(count:1, product:ve)     
    ]),             
    new Invoice(date:[107,1,2], items: [     
     new LineItem(count:4, product:ve)     
    ])             
]               

//error 
assert [5*1499, 499, 4*499] == invoices.items*.total() 

Dòng cuối cùng sẽ ném một ngoại lệ. Lúc đầu, tôi có thể giải thích tại sao lỗi này xảy ra. Các invocies là một List, và kiểu của phần tử là Invoice. Vì vậy, việc sử dụng trực tiếp các mục sẽ gây ra lỗi. Tôi cố gắng khắc phục bằng cách sử dụng invoices.collect{it.items*.total()}

Nhưng vẫn nhận được xác nhận không thành công. Vì vậy, làm thế nào tôi có thể làm cho sự thành công khẳng định và tại sao hoá đơn * .items * .total() sẽ ném một ngoại lệ.

Trả lời

7

Kết quả của nhà cung cấp invoices*. là danh sách, do đó kết quả của invoices*.items là danh sách các danh sách. flatten() có thể được áp dụng cho một danh sách và trả về danh sách phẳng, vì vậy bạn có thể sử dụng danh sách đó để tạo danh sách LineItems từ danh sách danh sách ListItems. Sau đó bạn có thể áp dụng total() đến các yếu tố của nó sử dụng toán tử lây lan:

assert [5*1499, 499, 4*499] == invoices*.items.flatten()*.total() 
+0

Tuyệt vời, cảm ơn! – linuxlsx

5

này không trả lời câu hỏi của bạn, nhưng nó có thể là thực hành tốt hơn cũng có một phương pháp tổng trong lớp hóa đơn của bạn như vậy:

int total() { 
    items*.total().sum() 
}       

sau đó bạn có thể kiểm tra điều này với:

assert [5*1499 + 499, 4*499] == invoices*.total() 
+0

cảm ơn, nó không hữu ích cho tôi. – linuxlsx