কোটলিনে ভেরিয়েবলের নাম বা স্প্রেড অপারেটরের আগে কোটলিন এস্টারস্ক্ক অপারেটর


102

আমি জানতে চাই কোটলিনে একটি পরিবর্তনশীল নামের আগে একটি নক্ষত্রটি ঠিক কী করে। আমি এটি ( *args) একটি স্প্রিং বুট কোটলিন উদাহরণে দেখেছি :

@SpringBootApplication
open class Application {

    @Bean
    open fun init(repository: CustomerRepository) = CommandLineRunner {
        repository.save(Customer("Jack", "Bauer"))
        repository.save(Customer("Chloe", "O'Brian"))
        repository.save(Customer("Kim", "Bauer"))
        repository.save(Customer("David", "Palmer"))
        repository.save(Customer("Michelle", "Dessler"))
    }
}

fun main(args: Array<String>) {
    SpringApplication.run(Application::class.java, *args)
}

উত্তর:


169

*অপারেটর হিসাবে পরিচিত হয় ছড়িয়ে অপারেটর Kotlin হবে।

থেকে Kotlin রেফারেন্স ...

যখন আমরা একটি ভারেগ-ফাংশন কল করি, আমরা একের পর এক আর্গুমেন্টগুলি পাস করতে পারি, উদাহরণস্বরূপ asList (1, 2, 3), বা, যদি ইতিমধ্যে আমাদের কাছে অ্যারে থাকে এবং এর বিষয়বস্তুটি ফাংশনে পাস করতে চান, আমরা স্প্রেডটি ব্যবহার করি অপারেটর (* সহ অ্যারের উপসর্গ):

এটি কোনও ক্রিয়াকলাপ গ্রহণ করার আগে এটি কোনও অ্যারে প্রয়োগ করার আগে এটি প্রয়োগ করা যেতে পারে varargs

উদাহরণ স্বরূপ...

আপনার যদি এমন কোনও ফাংশন থাকে যা বিবিধ সংখ্যক আর্গুমেন্ট গ্রহণ করে ...

fun sumOfNumbers(vararg numbers: Int): Int {
    return numbers.sum()
}

আপনি এর মতো একটি অ্যারে পাস করতে পারেন ...

val numbers = intArrayOf(2, 3, 4)
val sum = sumOfNumbers(*numbers)
println(sum) // Prints '9'

মন্তব্য:

  • *অপারেটর হয় গুণ অপারেটর (অবশ্যই)।
  • কোনও ফাংশনে আর্গুমেন্টগুলি পাস করার সময় কেবলমাত্র অপারেটর ব্যবহার করা যেতে পারে। অপারেশনের ফলাফল সংরক্ষণ করা যায় না কারণ এটি কোনও মূল্য দেয় না (এটি নিখুঁত সিনট্যাকটিক চিনি)।
  • অপারেটর প্রথমে কিছু সি / সি ++ প্রোগ্রামারকে বিভ্রান্ত করতে পারে কারণ দেখে মনে হচ্ছে যে কোনও পয়েন্টার ডি-রেফারেন্স করা হচ্ছে। তা নয়; কোটলিনের পয়েন্টারগুলির কোনও ধারণা নেই
  • ভারার্গ ফাংশনটি কল করার সময় অপারেটরটিকে অন্য তর্কগুলির মধ্যে ব্যবহার করা যেতে পারে । এখানে উদাহরণ হিসাবে এটি প্রদর্শিত হয় ।
  • অপারেটর applyবিভিন্ন ক্রিয়ামূলক প্রোগ্রামিং ভাষায় ফাংশনের অনুরূপ ।

স্প্রেড অপারেটর কি ইনলাইন অ্যারে? উদাহরণস্বরূপ অ্যারের জন্য a = [1, 2, 3] মজাউইটওয়্যারগ (* ক) মজাদারের সাথে ইনভ্যালওয়্যারওয়ার্গ (1,2,3)? আমি বাইটকোড স্তরের মানে
ডেভিড

23

"এই জিনিসটি কী !?!"! এর দিকে সরাসরি উত্তর ছিল সেগুলি ছাড়াও, আপনার প্রায়শই এমন ঘটনা ঘটে থাকে যেখানে আপনার একটি রয়েছে Listএবং এটি কোনও ফাংশনে যা আপনি প্রত্যাশা করছেন তা পাস করতে চান vararg। এর জন্য, রূপান্তরটি হ'ল:

someFunc(x, y, *myList.toTypedArray())

যে শেষ প্যারামিটার ধরে নেওয়া যাক someFuncহল varargতালিকায় উপাদান হিসাবে একই ধরণের।


তোমাকে অনেক ধন্যবাদ! আপনার স্প্রেড অপারেটর যখন কাজ করছেন না তখন তার নজরদারি করার জন্য এটি স্প্রেড অপারেটর বিভাগের অধীনে অফিসিয়াল ডক্সে থাকা উচিত।
সন্তুষ্টপটপ

ধন্যবাদ! সত্যিই সহায়ক। ভাবছেন পর্দার আড়ালে "স্প্রেড অপারেটর" কী? ভ্যারাগস মান পাওয়ার জন্য কি কেবল একটি উপায়?
নিকোলাস জাফল 18

11

ডকুমেন্টেশনে বর্ণিত হিসাবে এটি একটি স্প্রেড অপারেটর:

যখন আমরা একটি ভারেগ-ফাংশন কল করি, আমরা একের পর এক আর্গুমেন্টগুলি পাস করতে পারি, উদাহরণস্বরূপ asList (1, 2, 3), বা, যদি ইতিমধ্যে আমাদের কাছে অ্যারে থাকে এবং এর বিষয়বস্তুটি ফাংশনে পাস করতে চান, আমরা স্প্রেডটি ব্যবহার করি অপারেটর (* সহ অ্যারের উপসর্গ):

val a = arrayOf(1, 2, 3) 
val list = asList(-1, 0, *a, 4)

6

যদি কোনও ফাংশন যা কোনও ভারার্গ (আর্গুমেন্টের পরিবর্তনশীল সংখ্যার) পরামিতি গ্রহণ করে তবে:

fun sum(vararg data:Int)
{
   // function body here         
}

এখন এই পদ্ধতিটি কল করতে, আমরা এটি করতে পারি:

sum(1,2,3,4,5)

তবে আমাদের যদি একটি অ্যারেতে এই মান থাকে তবে:

val array= intArrayOf(1,2,3,4,5)

তারপরে, এই পদ্ধতিটি কল করতে আমাদের স্প্রেড অপারেটর ব্যবহার করতে হবে, যেমন:

 sum(*array)

এখানে, * (স্প্রেড অপারেটর) সেই অ্যারের সমস্ত সামগ্রী পাস করবে।

* অ্যারে 1,2,3,4,5 এর সমতুল্য

তবে এক মিনিট অপেক্ষা করুন, আমরা যদি এটিকে এটি বলি তবে কী sum(array) তা আমাদের টাইপ মিসমেচ সংকলনের সময় ত্রুটিটি দেয়:

Type mismatch.
Required:Int
Found:IntArray

সমস্যাটি হল sumফাংশনটি একটি vararg Intপ্যারামিটার গ্রহণ করুন (যা মানটিকে পছন্দ করে: 1,2,3,4,5) এবং যদি আমরা অ্যারে পাস করি তবে এটি পাস হবে IntArray


5

জাভাতে আপনি যেমন অ্যারে পাস করতে পারেন তবে স্প্রেড অপারেটরের সাথে অ্যারে আনপ্যাক করার সুবিধা *হ'ল স্প্রেড অপারেটর আপনাকে একটি অ্যারে থেকে মানগুলি এবং একক কলের মধ্যে কিছু স্থির মানগুলিকে একত্রিত করতে দেয়। জাভা এটি সমর্থন করে না।


4
উত্সাহিত, কারণ আমি নিজেকে জিজ্ঞাসা করেছি কেন তারা এটিকে এভাবে প্রয়োগ করেছে। আমি এখনও এটি সম্পর্কে 100% নিশ্চিত নই। মানে, তারা কি বেশিরভাগ ক্ষেত্রে কেবল এটি অনুমান করতে পারে না?
টিম বাথ

4
@ টিমব্যাথ কিছু ক্ষেত্রে এটি অনুমান করা সম্ভব হবে না, নিম্নলিখিত কেসগুলি বিবেচনা করুন val resultOne = arrayOf(intArrayOne, intArrayTwo)এবং val resultTwo = arrayOf(*intArrayOne, *intArrayTwo)। প্রকার resultOneএবং resultTwoযথাক্রমে Array<Int>এবং Array<Array<Int>>। আমি এর কারণগুলির মধ্যে একটি
ফরিদ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.