মজার বিষয় যে কোনও লেন্স যুক্ত করেনি, যেহেতু তারা এই ধরণের স্টাফের জন্য তৈরি হয়েছিল। সুতরাং, এখানে এটিতে একটি সিএস ব্যাকগ্রাউন্ড পেপার রয়েছে, এখানে এমন একটি ব্লগ যা স্কালায় লেন্সগুলি ব্যবহারের জন্য সংক্ষেপে স্পর্শ করে, এখানে স্কালাজের জন্য একটি লেন্স প্রয়োগকরণ এবং এখানে এটি ব্যবহার করার জন্য কিছু কোড রয়েছে, যা আপনার প্রশ্নের মতো আশ্চর্যরকম দেখাচ্ছে। এবং, বয়লার প্লেটটি কাটাতে, এখানে একটি প্লাগইন রয়েছে যা কেস ক্লাসগুলির জন্য স্কালাজ লেন্স তৈরি করে।
বোনাস পয়েন্টগুলির জন্য, এখানে আরও একটি এসও প্রশ্ন যা লেন্সগুলিতে স্পর্শ করে এবং টনি মরিসের একটি কাগজ ।
লেন্স সম্পর্কে বড় কথা হ'ল তারা কম্পোজেবল। সুতরাং এগুলি প্রথমে কিছুটা কষ্টকর, তবে আপনি যত বেশি এগুলি ব্যবহার করেন সেগুলি তারা স্থির করতে থাকে। এছাড়াও, তারা পরীক্ষার জন্য দুর্দান্ত, যেহেতু আপনাকে কেবল পৃথক লেন্স পরীক্ষা করতে হবে, এবং তাদের রচনাটি মঞ্জুর করতে পারে।
সুতরাং, এই উত্তরের শেষে প্রদত্ত একটি বাস্তবায়নের ভিত্তিতে আপনি লেন্স দিয়ে কীভাবে করবেন তা এখানে রয়েছে। প্রথমে, কোনও ঠিকানার মধ্যে একটি জিপ কোড এবং কোনও ব্যক্তির একটি ঠিকানা পরিবর্তন করার জন্য লেন্সগুলি ঘোষণা করুন:
val addressZipCodeLens = Lens(
get = (_: Address).zipCode,
set = (addr: Address, zipCode: Int) => addr.copy(zipCode = zipCode))
val personAddressLens = Lens(
get = (_: Person).address,
set = (p: Person, addr: Address) => p.copy(address = addr))
এখন, তাদের এমন একটি লেন্স পাওয়ার জন্য রচনা করুন যা কোনও ব্যক্তির মধ্যে জিপকোড পরিবর্তন করে:
val personZipCodeLens = personAddressLens andThen addressZipCodeLens
অবশেষে, রাজ পরিবর্তন করতে সেই লেন্স ব্যবহার করুন:
val updatedRaj = personZipCodeLens.set(raj, personZipCodeLens.get(raj) + 1)
বা, কিছু সিনট্যাকটিক চিনি ব্যবহার করে:
val updatedRaj = personZipCodeLens.set(raj, personZipCodeLens(raj) + 1)
অথবা এমনকি:
val updatedRaj = personZipCodeLens.mod(raj, zip => zip + 1)
এই উদাহরণের জন্য ব্যবহৃত স্ক্যালাজ থেকে নেওয়া সহজ বাস্তবায়ন এখানে:
case class Lens[A,B](get: A => B, set: (A,B) => A) extends Function1[A,B] with Immutable {
def apply(whole: A): B = get(whole)
def updated(whole: A, part: B): A = set(whole, part) // like on immutable maps
def mod(a: A, f: B => B) = set(a, f(this(a)))
def compose[C](that: Lens[C,A]) = Lens[C,B](
c => this(that(c)),
(c, b) => that.mod(c, set(_, b))
)
def andThen[C](that: Lens[B,C]) = that compose this
}