खोज…


परिचय

स्केला आपको किसी विधि पर कॉल करने के तरीकों या खेतों तक पहुंचने पर गतिशील आह्वान का उपयोग करने की अनुमति देता है। इसके बजाय इस भाषा में गहरी निर्मित होने के बजाय, यह अंतर्निहित रूपांतरण के समान पुनर्लेखन नियमों के माध्यम से पूरा किया जाता है, जो मार्कर विशेषता [ scala.Dynamic ] [डायनामिक स्केलडॉक] द्वारा सक्षम है। यह आपको गतिशील भाषाओं में मौजूद वस्तुओं में गतिशील रूप से गुण जोड़ने की क्षमता का अनुकरण करने की अनुमति देता है, और अधिक। [डायनामिक स्केलडोक]: http://www.scala-lang.org/api/2.12.x/scala/Dynamic.html

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

  • क्लास फू डायनेमिक का विस्तार करता है
  • foo.field
  • foo.field = मान
  • foo.method (args)
  • foo.method (nameArg = x, y)

टिप्पणियों

Dynamic उपप्रकारों को घोषित करने के लिए, भाषा सुविधा dynamics को सक्षम करना चाहिए, या तो scala.language.dynamics आयात scala.language.dynamics या scala.language.dynamics -language:dynamics कंपाइलर विकल्प द्वारा। इस Dynamic उपयोगकर्ता जो अपने स्वयं के उपप्रकार को परिभाषित नहीं करते हैं उन्हें इसे सक्षम करने की आवश्यकता नहीं है।

फील्ड एक्सेस

इस:

class Foo extends Dynamic {
  // Expressions are only rewritten to use Dynamic if they are not already valid
  // Therefore foo.realField will not use select/updateDynamic
  var realField: Int = 5
  // Called for expressions of the type foo.field
  def selectDynamic(fieldName: String) = ???
  def updateDynamic(fieldName: String)(value: Int) = ???
}

खेतों तक सरल पहुंच की अनुमति देता है:

val foo: Foo = ???
foo.realField // Does NOT use Dynamic; accesses the actual field
foo.realField = 10 // Actual field access here too
foo.unrealField // Becomes foo.selectDynamic(unrealField)
foo.field = 10  // Becomes foo.updateDynamic("field")(10)
foo.field = "10" // Does not compile; "10" is not an Int.
foo.x() // Does not compile; Foo does not define applyDynamic, which is used for methods.
foo.x.apply() // DOES compile, as Nothing is a subtype of () => Any
// Remember, the compiler is still doing static type checks, it just has one more way to
// "recover" and rewrite otherwise invalid code now.

विधि कॉल

इस:

class Villain(val minions: Map[String, Minion]) extends Dynamic {
  def applyDynamic(name: String)(jobs: Task*) = jobs.foreach(minions(name).do)
  def applyDynamicNamed(name: String)(jobs: (String, Task)*) = jobs.foreach {
    // If a parameter does not have a name, and is simply given, the name passed as ""
    case ("", task) => minions(name).do(task)
    case (subsys, task) => minions(name).subsystems(subsys).do(task)
  }
}

नामित मानकों के साथ और बिना विधियों के कॉल की अनुमति देता है:

val gru: Villain = ???
gru.blu() // Becomes gru.applyDynamic("blu")()
// Becomes gru.applyDynamicNamed("stu")(("fooer", ???), ("boomer", ???), ("", ???),
//         ("computer breaker", ???), ("fooer", ???))
// Note how the `???` without a name is given the name ""
// Note how both occurrences of `fooer` are passed to the method
gru.stu(fooer = ???, boomer = ???, ???, `computer breaker` = ???, fooer = ???)
gru.ERR("a") // Somehow, scalac thinks "a" is not a Task, though it clearly is (it isn't)

फ़ील्ड एक्सेस और अपडेट विधि के बीच सहभागिता

थोड़ा उल्टा (लेकिन यह भी काम करने का एकमात्र एकमात्र तरीका है), यह:

val dyn: Dynamic = ???
dyn.x(y) = z

के बराबर है:

dyn.selectDynamic("x").update(y, z)

जबकि

dyn.x(y)

अभी भी

dyn.applyDynamic("x")(y)

इसके बारे में पता होना महत्वपूर्ण है, अन्यथा यह किसी का ध्यान नहीं जा सकता और अजीब त्रुटियों का कारण बन सकता है।



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