2017-08-25 15 views
13

मैंने इस पर दस्तावेज़ों को 3 बार पढ़ा है और मुझे अभी भी पता नहीं है कि यह क्या करता है। क्या कोई ईएलआई 5 (समझा सकता है कि मैं पांच वर्ष का हूं) कृपया? यहाँ कैसे मैं इसे का उपयोग कर रहा है:कोटलिन में "साथ" का क्या अर्थ है?

fun main(args: Array<String>) { 
    val UserModel = UserModel() 
    val app = Javalin.create().port(7000).start() 

    with (app) { 
     get("/users") { 
      context -> context.json(UserModel) 
     } 
    } 
} 
+3

वाह, आपके प्रश्न ने मुझे एहसास दिलाया कि '**' होने पर कोई अच्छा दस्तावेज नहीं है - एक ** फ़ंक्शन ** होना, एक कीवर्ड नहीं - वास्तव में काम करता है! इसलिए मैंने एक प्रश्न लिखा और उसी प्रकार उत्तर दिया, शायद यह पहले से मौजूद उत्तरों के लिए कुछ मूल्य जोड़ देगा। देखें: [कोटलिन में "रिसीवर" क्या है?] (Https://stackoverflow.com/q/45875491/7079453) –

+1

क्या आप अभी भी उत्तर का इंतजार कर रहे हैं? ;-) – s1m0nw1

उत्तर

9

documentation का कहना है:

inline fun <T, R> with(receiver: T, block: T.() -> R): R (source)

अपने रिसीवर के रूप में दिया रिसीवर के साथ निर्दिष्ट समारोह ब्लॉक कॉल और उसके परिणाम देता है।

तरह से मैं इसके बारे में लगता है कि यह एक समारोह (block) जहां block के दायरे में thisreceiver है बुला रहा है है। जो भी block रिटर्न रिटर्न प्रकार है।

अनिवार्य रूप से एक विधि को कॉल करना जहां आप अंतर्निहित this प्रदान करते हैं और इससे कोई परिणाम वापस कर सकते हैं।

यहाँ प्रदर्शित करने के लिए एक उदाहरण है:

val rec = "hello" 
val returnedValue: Int = with(rec) { 
    println("$this is ${length}") 
    lastIndexOf("l") 
} 

rec इस मामले में समारोह कॉल की रिसीवर है - block के दायरे में this$length और lastIndexOf दोनों रिसीवर पर बुलाए जाते हैं।

वापसी मूल्य Int के रूप में देखा जा सकता है क्योंकि यह body में अंतिम विधि कॉल है - यह हस्ताक्षर के सामान्य प्रकार पैरामीटर R है।

+0

तो यह सिर्फ यह कहने का एक टूल है कि आप किस क्षेत्र में रहना चाहते हैं? –

+1

@VladyVeselinov अनिवार्य रूप से, हाँ। कुछ अन्य स्कोपिंग फ़ंक्शंस हैं जो आपको सही स्पष्ट कोड में मदद कर सकते हैं। आप [योल/कोटलिन-स्टाइल-गाइड गिटहब रिपोजिटरी] (https://github.com/yole/kotlin-style-guide/issues/35) में सामान्य उपयोग पैटर्न के बारे में कुछ उदाहरण और चर्चा देख सकते हैं। – mkobit

2

with किसी ऑब्जेक्ट के सदस्यों और विधियों तक पहुंच के लिए ऑब्जेक्ट को संदर्भित किए बिना उपयोग करने के लिए उपयोग किया जाता है। यह आपके कोड को संक्षेप में (ज्यादातर) है।

// Verbose way, 219 characters: 
var thing = Thingummy() 
thing.component1 = something() 
thing.component2 = somethingElse() 
thing.component3 = constantValue 
thing.component4 = foo() 
thing.component5 = bar() 
parent.children.add(thing) 
thing.refcount = 1 

// Terse way, 205 characters: 
var thing = with(Thingummy()) { 
    component1 = something() 
    component2 = somethingElse() 
    component3 = constantValue 
    component4 = foo() 
    component5 = bar() 
    parent.children.add(this) 
    refcount = 1 
} 
+0

यह इंगित करने का एक अच्छा समय भी है कि इससे अपरिवर्तनीयता को प्रोत्साहित किया जाता है; दूसरी 'var thing'' वैल चीज 'बननी चाहिए और गारंटी है कि जब तक आप इसे बदलना नहीं चाहते हैं तब तक यह कभी नहीं बदला जाता है – Supuhstar

5

with की परिभाषा:

inline fun <T, R> with(receiver: T, block: T.() -> R): R (source) 

वास्तव में यह कार्यान्वयन सीधे आगे है: blockreceiver पर निष्पादित किया जाता है, जो किसी भी प्रकार के लिए काम करता है:

यह अक्सर जब एक वस्तु के निर्माण के लिए किया जाता है
receiver.block() //that's the body of `with` 

यहां उल्लेख करने की महान बात है पैरामीटर प्रकार T.() -> R: इसे function literal with receiver कहा जाता है। यह वास्तव में लैम्ब्डा है जो किसी भी अतिरिक्त क्वालीफायर के बिना रिसीवर के सदस्यों तक पहुंच सकता है।

आपके उदाहरण में with रिसीवर app इस तरह से पहुंचा जा सकता है।

with या apply तरह stdlib कार्यों इसके अलावा, इस कार्यक्षमता क्या डोमेन विशिष्ट बोली लेखन के रूप में यह स्कोप के भीतर जो आप कुछ कार्यक्षमताओं पर उपयोग कर सकते है बनाए जा सकते हैं के लिए Kotlin महान बनाता है।

संबंधित मुद्दे