2012-08-26 9 views
8

जोड़ा जा रहा है मैं एक शानदार तरीका एक समय पाश का सहारा के बिना Xtend में निम्नलिखित व्यक्त करने के लिए खोजने के लिए प्रतीत नहीं कर सकते हैं:Xtend के लिए-लूप समर्थन और रेंज समर्थन

for(int i = 0; i < 3; i++){ 
    println("row "); 
} 
println("your boat"); 

तो, मुझे लगता है कि मेरे सवाल का दो है भागों:

  • क्या उपर्युक्त करने का कोई बेहतर तरीका है? मुझे उनके documenation
  • में कुछ भी वादा नहीं हुआ था, भाषा की सुविधाओं का एक बड़ा हिस्सा केवल Xtend लाइब्रेरी एक्सटेंशन हैं (और वे बहुत अच्छे हैं!)। क्या range() कार्यक्षमता à la Python है कि मुझे नहीं पता?

मैं अपने खुद के रोलिंग समाप्त हो गया है और निम्नलिखित की तरह कुछ मिल गया:

class LanguageUtil { 

def static Iterable<Integer> range(int stop) { 
    range(0, stop) 
} 

def static Iterable<Integer> range(int start, int stop) { 
    new RangeIterable(start, stop, 1) 
} 

def static Iterable<Integer> range(int start, int stop, int step) { 
    new RangeIterable(start, stop, step) 
} 
} 

// implements Iterator and Iterable which is bad form. 
class RangeIterable implements Iterator<Integer>, Iterable<Integer> { 
val int start 
val int stop 
val int step 
var int current 

new(int start, int stop, int step) { 
    this.start = start; 
    this.stop = stop; 
    this.step = step 
    this.current = start 
} 

override hasNext() { 
    current < stop 
} 

override next() { 
    val ret = current 
    current = current + step 
    ret 
} 

override remove() { 
    throw new UnsupportedOperationException("Auto-generated function stub") 
} 

/** 
* This is bad form. We could return a 
* new RangeIterable here, but that seems worse. 
*/ 
override iterator() { 
    this 
} 
} 

उत्तर

15

के लिए

for(int i = 0; i < 3; i++){ 
    println("row "); 
} 

सटीक प्रतिस्थापन अनन्य रेंज ऑपरेटर है

for (i : 0 ..< 3) { 
    println("row ") 
} 

नोटिस: ..<

4

हे, मैं इस सवाल का जवाब थोड़ी देर बाद में पाया:

for(i: 1..3) { 
    println("row ") 
} 
+0

तुम भी लिख से बच सकते हैं 'Integer' क्योंकि यह पूर्ण रूप से अपने Xtend द्वारा मान लिया जाता है। –

13

इसके अलावा, आप इसे और अधिक कर सकते हैं

(1..3).forEach[println("row")] 

बहुत Xtend के लिए नया है, लेकिन आदमी यह मीटर के साथ मुहावरे jvm भयानक पर प्रोग्रामिंग akes।

+0

ध्यान दें कि आपके पास लैम्ब्डा अभिव्यक्ति [] के अंदर कुछ प्रतिबंध है, उदाहरण के लिए यदि आप उस अभिव्यक्ति के अंदर एक स्थानीय परिवर्तनीय लोकलवायर का उपयोग करना चाहते हैं, तो आपको "लैम्ब्डा अभिव्यक्ति के अंदर गैर-अंतिम परिवर्तनीय लोकलवायर का संदर्भ नहीं मिल सकता"। मुझे मूल पोस्टर के प्रश्न के लिए पूरी तरह से rzymek द्वारा जवाब मिलता है। – CuongHuyTo

+0

नीचे दिए गए मेरे उत्तर को देखें यदि आपको फ़ंक्शन –

5
मेरे लिए

एक सीमा के आधार पर forEach तात्पर्य रेंज किसी भी तरह सार्थक है। कोई यात्रा चर के साथ समय की एक विशिष्ट संख्या पाशन के लिए, मैं रूबी के times पाश व्यक्त करता आशय अधिक स्पष्ट रूप से लगता है:

3.times [|println("row")] 

दुर्भाग्य से यह IntegerExtensions का एक हिस्सा नहीं है, लेकिन कार्यान्वयन तुच्छ है:

def static times(int iterations, Runnable runnable) { 
    if (iterations < 0) throw new IllegalArgumentException(
      '''Can't iterate negative («iterations») times.''') 
    for (i: 0 ..< iterations) runnable.run() 
} 
+0

फ़ंक्शन के भीतर पुनरावृत्ति अनुक्रमणिका की भी आवश्यकता है, तो इसे https://bugs.eclipse.org/bugs/show_bug.cgi?id=489944 में कोर एक्सटेंड लाइब्रेरी में जोड़ा जाने का सुझाव दिया गया है। – vorburger

3

के बाद से, हम जावा में जैसे "पारंपरिक" फॉर-लूप का भी समर्थन करते हैं।

3

वास्तव में forEach() का एक संस्करण है जो दो पैरामीटर के साथ लैम्ब्डा स्वीकार करता है। यदि आपको लूप के भीतर पुनरावृत्ति अनुक्रमणिका तक पहुंचने की आवश्यकता है तो यह उपयोगी है।

(10..12).forEach[ x, i | println('''element=«x» index=«i»''')] 

प्रिंट:

element=10 index=0 
element=11 index=1 
element=12 index=2 
संबंधित मुद्दे