2012-05-23 9 views
6

मैं हाल ही में 'ग्रोवी इन एक्शन' पढ़ रहा हूं। अध्याय 7 में, यह * पेश किया गया। ऑपरेटर । जब मैं इस ऑपरेटर के बारे में कोड चलाता हूं, तो मुझे कुछ गलतियां मिलती हैं।ग्रोवी *। ऑपरेटर

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

अंतिम पंक्ति अपवाद फेंक देगी। सबसे पहले, मैं समझा सकता हूं कि यह त्रुटि क्यों खुश है। चालान एक सूची है, और तत्व का प्रकार चालान है। तो सीधे आइटम का उपयोग कर एक त्रुटि होगी। मैं invoices.collect{it.items*.total()}

का उपयोग करके इसे ठीक करने का प्रयास करता हूं लेकिन फिर भी एक असफल असर मिलता है। तो, मैं जोरदार सफलता कैसे बना सकता हूं और क्यों चालान * .items * .total() अपवाद फेंक देगा।

उत्तर

7

invoices*. ऑपरेटर का परिणाम एक सूची है, इसलिए invoices*.items का परिणाम सूचियों की एक सूची है। flatten() को सूचियों पर लागू किया जा सकता है और एक फ्लैट सूची लौटाता है, ताकि आप की अपनी सूची से LineItems की सूची बनाने के लिए इसका उपयोग कर सकें। इसके बाद आप प्रसार ऑपरेटर का उपयोग उसके तत्वों को total() आवेदन कर सकते हैं:

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

बहुत बढ़िया है, धन्यवाद! – linuxlsx

5

यह आपके सवाल का जवाब नहीं है, लेकिन यह भी तो जैसे अपने चालान कक्षा में कुल विधि के लिए बेहतर अभ्यास हो सकता है:

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

फिर आप के साथ इस जाँच कर सकते हैं:

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

धन्यवाद, यह मेरे लिए बहुत उपयोगी नहीं है। – linuxlsx