কি করে?: কোটলিনে কর? (এলভিস অপারেটর)


98

আমি ?:উদাহরণস্বরূপ এই ক্ষেত্রে কি করে তা বুঝতে পারি না

val list = mutableList ?: mutableListOf() 

এবং কেন এটি এতে পরিবর্তন করা যায়

val list = if (mutableList != null) mutableList else mutableListOf()

4
বাম দিকে ফিরে যান যদি এটি শূন্য না হয়, অন্যথায় ডানদিকে ফিরে যান। প্রথম প্রকাশটি দ্বিতীয় প্রকাশের জন্য সংক্ষিপ্ত স্বরলিপি। কোটলিংলং.আর্গ
ইউজেন পেচানেক

উত্তর:


115

টিএল; ডিআর: যদি ফলাফলের অবজেক্টের রেফারেন্স [প্রথম অপারেন্ড] না হয় nullতবে তা ফেরত দেওয়া হবে। অন্যথায় দ্বিতীয় অপারেন্ডের মান (যা হতে পারে null) ফিরে আসে


এলভিস অপারেটর অনেক প্রোগ্রামিং ভাষার, যেমন Kotlin কিন্তু খাঁজকাটা বা C # অংশ। আমি উইকিপিডিয়া সংজ্ঞাটি বেশ নির্ভুল মনে করি:

নির্দিষ্ট কম্পিউটার প্রোগ্রামিং ল্যাঙ্গুয়েজে, এলভিস অপারেটর ?: একটি বাইনারি অপারেটর , যদি অপারেন্ডটি হয় তবে এটি তার প্রথম অপারেন্ডকে ফেরত দেয় trueএবং অন্যথায় তার দ্বিতীয় অপারেন্ডকে মূল্যায়ন করে এবং ফেরত দেয়। এটা একটা হয় তিন শর্তসাপেক্ষ অপারেটর বৈকল্পিক , ? :সেই ভাষা (এবং আরও অনেক কিছু) এ পাওয়া যায়নি: এলভিস অপারেটর দ্বিতীয় বাদ দেওয়া প্রতীক সঙ্গে তিন অপারেটর

নিম্নলিখিতটি কোটলিনের জন্য বিশেষত সত্য:

কিছু কম্পিউটার প্রোগ্রামিং ভাষার এই অপারেটরের জন্য বিভিন্ন শব্দার্থবিজ্ঞান রয়েছে। প্রথম অপারেন্ডের পরিবর্তে বুলিয়ান তৈরি হওয়ার পরিবর্তে এটি অবশ্যই কোনও অবজেক্টের রেফারেন্সে আসতে পারে । যদি ফলাফলের অবজেক্টের রেফারেন্স না হয় nullতবে তা ফেরত দেওয়া হবে। অন্যথায় দ্বিতীয় অপারেন্ডের মান (যা হতে পারে null) ফিরে আসে।

একটি উদাহরণ:

x ?: y // yields `x` if `x` is not null, `y` otherwise.

4
এটা সত্যিই দুর্দান্ত। আমি কখনও ভাবিনি elvis operatorযে আরও কিছুটা আরও কমে যেতে পারে। সুন্দর! এবং সুন্দর ব্যাখ্যা, আপনাকে ধন্যবাদ!
Sud007

88

এলভিস অপারেটর একটি কোলন দ্বারা অনুসরণ একটি প্রশ্ন চিহ্ন দ্বারা প্রতিনিধিত্ব করা হয়: ?:এবং এটি এই সিনট্যাক্স সঙ্গে ব্যবহার করা যেতে পারে:

first operand ?: second operand

এটি আপনাকে কনসাইজ কোড লিখতে সক্ষম করে এবং এগুলি হিসাবে কাজ করে:

যদি first operand শূন্য না হয় তবে তা ফিরে আসবে। যদি এটি নাল হয় , তবে second operandঅবশ্যই ফিরে আসবে। এটি গ্যারান্টি হিসাবে ব্যবহার করা যেতে পারে যে কোনও অভিব্যক্তি নাল মান ফিরিয়ে দেবে না, কারণ প্রদত্ত মানটি যদি শূন্য হয় তবে আপনি একটি নন-অযোগ্য মান সরবরাহ করবেন।


উদাহরণস্বরূপ (কোটলিনে):

fun retrieveString(): String {    //Notice that this type isn't nullable
    val nullableVariable: String? = getPotentialNull() //This variable may be null
    
    return nullableVariable ?: "Secondary Not-Null String"
}

এই ক্ষেত্রে, যদি গণনা করা মানটি getPotentialNullশূন্য না হয় তবে এটি দ্বারা ফিরে আসবে retrieveString; যদি এটি নাল হয় তবে দ্বিতীয় প্রকাশটি "Secondary Not-Null String"পরিবর্তে ফিরে আসবে।

এছাড়াও মনে রাখবেন যে ডান হাতের এক্সপ্রেশনটি কেবল তখনই বাম-হাতের অংশটি শূন্য হলে মূল্যায়ন করা হয় ।

Kotlin, আপনি যে কোন অভিব্যক্তি ব্যবহার করতে পারে second operandএই ধরনের একটি হিসাবে, throw Exceptionঅভিব্যক্তি

return nullVariable ?: throw IllegalResponseException("My inner function returned null! Oh no!")

এলভিস অপারেটর নামটি বিখ্যাত আমেরিকান গায়ক এলভিস প্রিসলি থেকে এসেছে । তার চুলচেরা একটি প্রশ্ন চিহ্ন অনুরূপ

এলভিস প্রশ্নমর্ক ark

সূত্র: ওয়াজদা, আই মোসকালা, এম। অ্যান্ড্রয়েড ডেভলপমেন্ট উইথ কোটলিন। 2017. প্যাক প্রকাশনা


84
মিস্টার
প্রসলে


4
কিছুক্ষণ পরে, আমি কেন বুঝতে পারি না কেন এটি এলভিস অপারেটর বলে। আপনার দৃষ্টান্ত আমাকে কেন তা এলভিস অপারেটর বলে ডেকে আনে। :)
Yohanes এআই

এলভিস সম্পর্কে গল্পটি আসলেই কি সত্য? হাহা
হিলকো

@ কেরুকার তিনি হাসছেন না,?: | আরও ভাল আইএমও হবে।
আহমদ গালাল

38

একে এলভিস অপারেটর বলা হয় এবং এটি করে ... আপনি নিজের প্রশ্নে ঠিক কী বর্ণনা করেছেন। যদি এর বাম হাতের nullমান একটি মান হয় তবে এটি পরিবর্তে ডান দিকটি ফিরিয়ে দেয়, ফ্যালব্যাক হিসাবে সাজান। অন্যথায় এটি কেবল বাম দিকে মান দেয় returns

a ?: bকেবল শর্টহ্যান্ডের জন্য if (a != null) a else b

প্রকার সহ আরও কয়েকটি উদাহরণ:

val x: String? = "foo"
val y: String = x ?: "bar"      // "foo", because x was non-null    

val a: String? = null
val b: String = a ?: "bar"      // "bar", because a was null

10
আপনি যদি জাভা থেকে আগত হন তবে এটি আরও সংক্ষিপ্ত a != null ? a : b
রূপ

9

এর সংজ্ঞাটি একবার দেখুন :

যখন আমাদের একটি অযোগ্য রেফারেন্স r থাকে, আমরা বলতে পারি "r যদি নাল না হয় তবে এটি ব্যবহার করুন, অন্যথায় কিছু নন-নাল মান ব্যবহার করুন":

?:(এলভিস) অপারেটর ভারবোসিটি এড়াতে এবং সত্যিই সংক্ষিপ্ত আপনার কোড তোলে।

উদাহরণস্বরূপ, প্রচুর সংগ্রহ এক্সটেনশন ফাংশন nullফ্যালব্যাক হিসাবে ফিরে আসে ।

listOf(1, 2, 3).firstOrNull { it == 4 } ?: throw IllegalStateException("Ups")

?:আপনার ফ্যালব্যাকের একাধিক স্তর থাকা সত্ত্বেও আপনাকে ফ্যালব্যাক কেসটি এলিগেন্টালি হ্যান্ডেল করার একটি উপায় দেয়। যদি তা হয় তবে আপনি সহজেই এখানে এলভিস অপারেটরগুলিকে বহুগুণে চেইন করতে পারেন:

val l = listOf(1, 2, 3)

val x = l.firstOrNull { it == 4 } ?: l.firstOrNull { it == 5 } ?: throw IllegalStateException("Ups")

আপনি যদি অন্যটির সাথে একইটি প্রকাশ করেন তবে এটি আরও অনেক কোড হবে যা পড়া শক্ত।


3

সহজভাবে আমরা এটি বলতে পারি, আপনার দুটি হাত রয়েছে। আপনি জানতে চান, আপনার বাঁ হাত এখনই কাজ করছে ?. বাম হাত যদি কাজ না করে, return emptyঅন্যথায়busy

জাভা জন্য উদাহরণ:

private int a;
if(a != null){
    println("a is not null, Value is: "+a)
}
else{
    println("a is null")
}

কোটলিনের উদাহরণ:

val a : Int = 5
val l : Int = if (a != null) a.length else "a is null"

এই উত্তরটি ভালবাসি। বুঝতে অনেক বেশি পরিষ্কার।
জি কে মোহাম্মদ ইমন

2

মূলত, যদি কোনও কারণে এলভিসের বাম দিকটি শূন্য হয় তবে পরিবর্তে ডান দিকটি ফিরে আসে।

অর্থাত্

val number: Int? = null
println(number ?: "Number is null")

সুতরাং, সংখ্যাটি শূন্য না হলে এটি মুদ্রণ করবে, অন্যথায় "সংখ্যাটি নাল হয়" মুদ্রণ করবে।


1

কোটলিনের এলভিস অপারেটর নাল সুরক্ষার জন্য ব্যবহৃত হয়।

x = a ?: b

উপরের কোড ইন, xমান নির্ধারিত হবে aএকটি নয় nullএবং bযদি aহয় null

এলভিস অপারেটরটি ব্যবহার না করে সমতুল্য কোটলিন কোডটি নীচে রয়েছে:

x = if(a == null) b else a

1

একটু সংযোজন যদিও এটি

X = A ?: B

Xএখনও nullযদি উভয় হয় Aএবং Bমূল্যায়নnull

অতএব, আপনি যদি Xসর্বদা থাকতে চান তবে non-nullনিশ্চিত হন যে Bএটি সর্বদা একটি non-nullবা এটি কোনও ফাংশন বা অভিব্যক্তি কিনা তা Bসর্বদা মূল্যায়ন non-nullকরে।

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