खोज…


वाक्य - विन्यास

  • {क्लाज} शरीर के लिए
  • {क्लाज} के लिए शरीर प्राप्त करें
  • (खंड) शरीर के लिए
  • के लिए (खंड) उपज शरीर

पैरामीटर

पैरामीटर विवरण
के लिये लूप / कॉम्प्रिहेंशन का उपयोग करने के लिए आवश्यक कीवर्ड
खंड कार्य के लिए जिस पर पुनरावृत्ति और फ़िल्टर होता है।
प्राप्ति यदि आप एक संग्रह बनाना या बनाना चाहते हैं तो इसका उपयोग करें। yield का उपयोग करने से Unit बजाय संग्रह के for रिटर्न का प्रकार होगा।
तन अभिव्यक्ति के शरीर, प्रत्येक पुनरावृत्ति पर निष्पादित।

बुनियादी लूप के लिए

for (x <- 1 to 10)
  println("Iteration number " + x)

यह 1 से 10 तक चर, x पुन: प्रदर्शित करता है और उस मान के साथ कुछ करता है। समझ के for इसका वापसी प्रकार Unit

बुनियादी समझ के लिए

यह फॉर-लूप पर एक फ़िल्टर प्रदर्शित करता है, और yield का उपयोग 'अनुक्रम समझ' बनाने के लिए करता है:

for ( x <- 1 to 10 if x % 2 == 0)
  yield x

इसके लिए आउटपुट है:

scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4, 6, 8, 10)

जब आप पुनरावृत्‍ति के आधार पर एक नया संग्रह बनाना चाहते हैं, तो यह समझ के लिए उपयोगी है।

नेस्ट फॉर लूप

यह दिखाता है कि आप कई चर पर कैसे पुनरावृति कर सकते हैं:

for {
  x <- 1 to 2
  y <- 'a' to 'd'
} println("(" + x + "," + y + ")")

(ध्यान दें कि to एक इन्फ़िक्स ऑपरेटर विधि है कि एक रिटर्न है यहाँ समावेशी रेंज । परिभाषा को देखें यहाँ ।)

यह आउटपुट बनाता है:

(1,a)
(1,b)
(1,c)
(1,d)
(2,a)
(2,b)
(2,c)
(2,d)

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

for (
  x <- 1 to 2
  y <- 'a' to 'd'
) println("(" + x + "," + y + ")")

सभी संयोजनों को एकल वेक्टर में लाने के लिए, हम परिणाम yield कर सकते हैं और इसे val सेट कर सकते हैं:

val a = for {
  x <- 1 to 2
  y <- 'a' to 'd'
} yield "(%s,%s)".format(x, y)
// a: scala.collection.immutable.IndexedSeq[String] = Vector((1,a), (1,b), (1,c), (1,d), (2,a), (2,b), (2,c), (2,d))

समझ के लिए मौद्रिक

यदि आपके पास कई प्रकार के मोनैडिक प्रकार हैं, तो हम 'समझ के लिए' का उपयोग करके मूल्यों के संयोजन प्राप्त कर सकते हैं:

for {
   x <- Option(1)
   y <- Option("b")
   z <- List(3, 4)
} {
    // Now we can use the x, y, z variables
    println(x, y, z)
    x  // the last expression is *not* the output of the block in this case!
}

// This prints
// (1, "b", 3)
// (1, "b", 4)

इस ब्लॉक का रिटर्न टाइप Unit

यदि वस्तुएं एक ही समान प्रकार के M (जैसे Option ) तो yield का उपयोग करने से Unit बजाय टाइप M का एक ऑब्जेक्ट वापस आ जाएगा।

val a = for {
   x <- Option(1)
   y <- Option("b")
} yield {
    // Now we can use the x, y variables
    println(x, y)
    // whatever is at the end of the block is the output
    (7 * x, y)
}

// This prints:
// (1, "b")
// The val `a` is set:
// a: Option[(Int, String)] = Some((7,b))

ध्यान दें कि yield कीवर्ड का उपयोग मूल उदाहरण में नहीं किया जा सकता है, जहां मोनैडिक प्रकार ( Option और List ) का मिश्रण है। ऐसा करने की कोशिश करने से एक संकलन-समय प्रकार बेमेल त्रुटि होगी।

एक लूप के लिए संग्रह के माध्यम से Iterate

यह दर्शाता है कि मानचित्र के प्रत्येक तत्व को कैसे प्रिंट किया जाए

val map = Map(1 -> "a", 2 -> "b")
for (number <- map) println(number) // prints (1,a), (2,b)
for ((key, value) <- map) println(value) // prints a, b

यह दर्शाता है कि सूची के प्रत्येक तत्व को कैसे प्रिंट किया जाए

val list = List(1,2,3)
for(number <- list) println(number) // prints 1, 2, 3

समझ के लिए उतरना

Scala में समझ के for बस वाक्यविन्यास चीनी हैं । ये flatMap अपने विषय प्रकारों के withFilter , foreach , flatMap और map विधियों का उपयोग करके कार्यान्वित की withFilter हैं। इस कारण से, इन विधियों को परिभाषित करने वाले केवल प्रकारों का उपयोग एक समझ के for किया जा सकता है।

एक for निम्न प्रपत्र की समझ, पैटर्न के साथ pN , जेनरेटर gN और शर्तों cN :

for(p0 <- x0 if g0; p1 <- g1 if c1) { ??? }

... डी-चीनी का उपयोग कर नेस्टेड कॉल करने के लिए होगा withFilter और foreach :

g0.withFilter({ case p0 => c0  case _ => false }).foreach({
  case p0 => g1.withFilter({ case p1 => c1  case _ => false }).foreach({
    case p1 => ???
  })
})

जबकि एक for / yield निम्नलिखित फार्म की अभिव्यक्ति:

for(p0 <- g0 if c0; p1 <- g1 if c1) yield ???

... डी-शुगर के साथ नेस्टेड कॉल के साथ withFilter और flatMap map या map का उपयोग withFilter :

g0.withFilter({ case p0 => c0  case _ => false }).flatMap({
  case p0 => g1.withFilter({ case p1 => c1  case _ => false }).map({
    case p1 => ???
  })
})

(ध्यान दें कि map का उपयोग अंतरतम समझ में किया जाता है, और flatMap का उपयोग हर बाहरी समझ में किया जाता है।)

डी-सुगरेड प्रतिनिधित्व द्वारा आवश्यक तरीकों को लागू करने के लिए किसी भी प्रकार के for एक समझ के for लागू किया जा सकता है। इन विधियों के वापसी प्रकारों पर कोई प्रतिबंध नहीं है, इसलिए जब तक वे रचना करने योग्य होते हैं।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow