কোটলিনে সম্পদ-সহ চেষ্টা করুন


147

আমি যখন tryকোটলিনে জাভা -সংস্থান-সংস্থান কোডের সমতুল্য লেখার চেষ্টা করেছি , এটি আমার পক্ষে কার্যকর হয়নি।

আমি নিম্নলিখিত বিভিন্ন প্রকারের চেষ্টা করেছি:

try (writer = OutputStreamWriter(r.getOutputStream())) {
    // ...
}

কিন্তু কোনটিই কাজ করে না।

পরিবর্তে কী ব্যবহার করা উচিত তা কি কেউ জানেন? স্পষ্টতই কোটলিন ব্যাকরণটির এমন নির্মাণের সংজ্ঞা নেই , তবে সম্ভবত আমি কিছু মিস করছি। এটি ট্রাই ব্লকের জন্য ব্যাকরণকে নিম্নলিখিতভাবে সংজ্ঞায়িত করেছে:

try : "try" block catchBlock* finallyBlock?;

উত্তর:


219

নেই use-function মধ্যে kotlin stdlib ( src )।

এটি কিভাবে ব্যবহার করতে:

OutputStreamWriter(r.getOutputStream()).use {
    // by `it` value you can get your OutputStreamWriter
    it.write('a')
}

3
আমি এক্সটেনশন পদ্ধতি খুব পছন্দ করি। আপনি করতে পারেন এমন অনেক কিছুই এবং অতিরিক্ত ভাষার বৈশিষ্ট্যগুলির প্রয়োজন নেই।
কিরিল রাখমান

20
এটি যুক্ত করে, বাস্তবে OutputStreamWriterr.outputStream.writer.use { ... }
এটির

3
রেফারেন্স ডকের লিঙ্কটি যা useবর্ধিতকরণটি দেখায় : kotlinlang.org/docs/references/…
জাভারু

1
আমি কীভাবে আরও ভাল উপায়ে মাল্টি "ব্যবহার" করতে পারি? FileOutputStream(into).use { val mergingStream = BufferedOutputStream(it).use { } }
পোনোমারেঙ্কো ওলেহ

43

টিএল; ডিআর: কোনও বিশেষ সিনট্যাক্স নয়, কেবল একটি ফাংশন

কোটলিন, জাভার বিপরীতে, এর জন্য একটি বিশেষ সিনট্যাক্স নেই। পরিবর্তে, চেষ্টা-সহ-সংস্থানগুলি , স্ট্যান্ডার্ড লাইব্রেরি ফাংশন হিসাবে দেওয়া হয় use

FileInputStream("filename").use { fis -> //or implicit `it`
   //use stream here
} 

useবাস্তবায়নের

@InlineOnly
public inline fun <T : Closeable?, R> T.use(block: (T) -> R): R {
    var closed = false
    try {
        return block(this)
    } catch (e: Exception) {
        closed = true
        try {
            this?.close()
        } catch (closeException: Exception) {
        }
        throw e
    } finally {
        if (!closed) {
            this?.close()
        }
    }
}

এই ফাংশনটি সমস্ত Closeable?ধরণের জেনেরিক এক্সটেনশন হিসাবে সংজ্ঞায়িত করা হয় । Closeableজাভা এর ইন্টারফেস যা জাভা SE7 হিসাবে -সংস্থানগুলি ব্যবহার করার অনুমতি দেয় । ফাংশনটি একটি ফাংশন আক্ষরিক লাগে যা একটিতে কার্যকর হয় । জাভাতে চেষ্টা-সহ-সংস্থান হিসাবে একই , এটি একটিতে বন্ধ হয়ে যায় ।
blocktryCloseablefinally

এছাড়াও ভিতরে ঘটছে ব্যর্থতা blockসীসা closeহত্যা, যেখানে সম্ভব ব্যতিক্রম আক্ষরিক হয় শুধু তাদের উপেক্ষা করে "চাপা"। এটি চেষ্টা-সহ-সংস্থান থেকে পৃথক , কারণ জাভা এর সমাধানে এই জাতীয় ব্যতিক্রমগুলি অনুরোধ করা যেতে পারে ।

এটি কিভাবে ব্যবহার করতে

useএক্সটেনশন কোন পাওয়া যায় Closeableপাঠকদের ইত্যাদি, অর্থাত্ স্ট্রীম করে, প্রকার।

FileInputStream("filename").use {
   //use your stream by referring to `it` or explicitly give a name.
} 

কোঁকড়া বন্ধনীগুলির অংশটি যা হয় তা blockহয় use(একটি ল্যাম্বদা এখানে আর্গুমেন্ট হিসাবে পাস করা হয়)। ব্লকটি শেষ হওয়ার পরে, আপনি নিশ্চিত FileInputStreamহয়ে উঠতে পারেন যে এটি বন্ধ হয়ে গেছে।


16

সম্পাদনা করুন : নিম্নলিখিত প্রতিক্রিয়া এখনও কোটলিন 1.0.x এর জন্য বৈধ is কোটলিন 1.1 এর জন্য, এমন একটি স্ট্যান্ডার্ড লাইব্রেরি রয়েছে যা জাভা 8 টার্গেট করে ক্লোজেবল রিসোর্স প্যাটার্ন সমর্থন করে।

অন্যান্য শ্রেণীর জন্য যারা "ব্যবহার" ফাংশন সমর্থন করে না, আমি নিম্নলিখিত গৃহস্থালিতে চেষ্টা করেছিলাম সংস্থানগুলি ব্যবহার করে:

package info.macias.kotlin

inline fun <T:AutoCloseable,R> trywr(closeable: T, block: (T) -> R): R {
    try {
        return block(closeable);
    } finally {
        closeable.close()
    }
}

তারপরে আপনি এটি নিম্নলিখিত উপায়ে ব্যবহার করতে পারেন:

fun countEvents(sc: EventSearchCriteria?): Long {
    return trywr(connection.prepareStatement("SELECT COUNT(*) FROM event")) {
        var rs = it.executeQuery()
        rs.next()
        rs.getLong(1)
    }
}

1
এটি পরিশেষে ধারাটি থেকে বাদ দেওয়া ব্যতিক্রমগুলি যথাযথভাবে মোকাবেলা করে না, যা জাভাতে সম্পদ-সংস্থান যুক্ত করার অন্যতম কারণ। এটি কেবল একটি সাধারণ try/finallyব্লক
নিকোলা মিহাজলভিć

0

যেহেতু এই স্ট্যাক ওভারফ্লো পোস্টটি "কোটলিনের নিকটবর্তী উদাহরণ" এর জন্য বর্তমান অনুসন্ধান ফলাফলের শীর্ষের নিকটবর্তী এবং এখনও অন্য কোনও উত্তর (না সরকারী দস্তাবেজগুলি) কীভাবে Closeable(ওরফে java.io.Closeable) প্রসারিত করা যায় তা স্পষ্টভাবে ব্যাখ্যা করে না , তাই আমি ভেবেছিলাম যে আমি একটি উদাহরণ যুক্ত করব আপনার নিজের ক্লাসটি কীভাবে বাড়ানো যায় তা Closeable। এটা এইভাবেই চলে:

import java.io.Closeable

class MyServer : Closeable {
    override fun close() {
        println("hello world")
    }
}

এবং তারপরে এটি ব্যবহার করতে:

fun main() {
    val s = MyServer()
    s.use {
        println("begin")
    }
    println("end")
}

Kotlin খেলার মাঠ এই উদাহরণ দেখুন এখানে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.