सवाल डेटा को संशोधित जिक्र नहीं किया था, लेकिन आप क्या करने की जरूरत है जब यह आपको जल्दी से स्केल लाइब्रेरी में यह आसान बनाने के लिए टूल नहीं है (जब डेटा अपरिवर्तनीय है)। यदि आपने अभी तक इसका अनुभव नहीं किया है, तो प्रश्न में परिभाषित प्रकारों का उपयोग करके Person
द्वारा आयोजित Cash
के value
को प्रतिस्थापित करने या संशोधित करने वाले फ़ंक्शन को लिखने का प्रयास करें।
टोनी मॉरिस 'Asymmetric Lenses in Scala, लेंस में वर्णित अनुसार इस समस्या का उचित समाधान है।
यहाँ हम कैसे जाएं और Scalaz की scalaz-seven शाखा से एक व्यक्ति के Cash
Lens
और PLens
(आंशिक लेंस) कार्यान्वयन का उपयोग करने का value
अद्यतन कर सकते हैं का एक उदाहरण है।
सबसे पहले, कुछ बॉयलरप्लेट: केस कक्षाओं के प्रत्येक क्षेत्र के लिए लेंस उदाहरण परिभाषित करें। A @[email protected] B
का अर्थ Lens[A, B]
जैसा है।
val pants: Person @[email protected] Option[Pants] =
lensG(_.pants, p => ps => p.copy(pants = ps))
val pocket: Pants @[email protected] Option[Pocket] =
lensG(_.pocket, ps => p => ps.copy(pocket = p))
val cash: Pocket @[email protected] Option[Cash] =
lensG(_.cash, p => c => p.copy(cash = c))
val value: Cash @[email protected] String =
lensG(_.value, c => v => c.copy(value = v))
हम इन लेंसों के सभी रचना नहीं कर सकते, तथापि, क्योंकि क्षेत्रों के सबसे Option
प्रकार में लिपटे रहे हैं।
आंशिक लेंस बचाव के लिए: इन हमें पहुँच सकते हैं और एक संरचना है कि , इस तरह के मौजूद न हो एक Option
की Some
मूल्य, या एक List
की head
के रूप में की अद्यतन भागों करने देते हैं।
हम प्रत्येक वैकल्पिक फ़ील्ड को देखने वाले आंशिक लेंस बनाने के लिए स्कालज़ 7 से somePLens
फ़ंक्शन का उपयोग कर सकते हैं।हमारे नियमित लेंस में से एक के साथ आंशिक लेंस लिखने के लिए, हमें विधि पर मौजूद partial
विधि का उपयोग करके, नियमित लेंस के लिए समकक्ष आंशिक लेंस उदाहरण तक पहुंचने की आवश्यकता है।
// @-? is an infix type alias for PLens
val someCash: Pocket @-? Cash = cash.partial andThen somePLens
scala> someCash.get(Pocket(Some(Cash("zilch"))))
res1: Option[Cash] = Some(Cash(zilch))
उसी तरह, हम सब अपने लेंस 'partial
उदाहरणों लिखने, और somePLens
के उदाहरण sandwiching द्वारा नकद एक Person
द्वारा आयोजित देखने हमारे आंशिक लेंस बना सकते हैं। यहां, मैंने <=<
ऑपरेटर का उपयोग किया है, andThen
के लिए उपनाम (जो ऑपरेटरों के साथ compose
के बराबर है)।
scala> someCashValue.get(ben)
res2: Option[String] = Some(zilch)
मूल्य को संशोधित करने के आंशिक लेंस का उपयोग करना: मैं नकदी की मूल्य तक पहुँचने के लिए आंशिक लेंस का प्रयोग
val ben = Person(Some(Pants(Some(Pocket(Some(Cash("zilch")))))))
:
val someCashValue: Person @-? String =
pants.partial <=< somePLens <=<
pocket.partial <=< somePLens <=<
cash.partial <=< somePLens <=<
value.partial
साथ खेलने के लिए एक Person
उदाहरण बनाना :
scala> someCashValue.mod(_ + ", zero, nada", ben)
res3: Person = Person(Some(Pants(Some(Pocket(Some(Cash(zilch, zero, nada)))))))
(!) 0
अब, अगर मैं नहीं किसी भी पैंट पहने हुए है, हम देख सकते हैं कि मेरी नकदी की मूल्य को संशोधित करने की कोशिश कोई प्रभाव नहीं पड़ेगा:
scala> val ben = Person(None)
ben: Person = Person(None)
scala> someCashValue.mod(_ + ", zero, nada", ben)
res4: Person = Person(None)
बहुत बढ़िया, धन्यवाद! समझदारी दृष्टिकोण वास्तव में वही है जो मैं करने की कोशिश कर रहा था, लेकिन जिस संरचना के साथ मैं काम कर रहा हूं वह उतना स्वच्छ नहीं है जितना मैंने ऊपर दिया था। कम से कम यह पुष्टि करता है कि मैं सही रास्ते पर हूं। –