উত্তর:
আপনি let
এই জাতীয়- ফাংশন ব্যবহার করতে পারেন :
val a = b?.let {
// If b is not null.
} ?: run {
// If b is null.
}
মনে রাখবেন যে আপনার run
যদি কোডের একটি ব্লকের প্রয়োজন হয় তবেই আপনাকে ফাংশনটি কল করতে হবে। run
এলভিস-অপারেটর ( ?:
) এর পরে যদি আপনার কেবলমাত্র অনাইনার থাকে তবে আপনি অবরুদ্ধটিকে সরাতে পারেন ।
সচেতন হন যে run
ব্লকটি যদি b
নাল হয় তবে মূল্যায়ন করা হবে , অথবা let
-ব্লক যদি মূল্যায়ন করে null
।
এ কারণে, আপনি সাধারণত কেবল একটি if
অভিব্যক্তি চান ।
val a = if (b == null) {
// ...
} else {
// ...
}
এই ক্ষেত্রে, else
-বন্ধটি কেবল b
শূন্য না হলে মূল্যায়ন করা হবে ।
a
এখনো সুযোগ ভিতরে সংজ্ঞায়িত করা হয় না let
এবং run
। তবে আপনি অন্তর্নিহিত প্যারামিটার দিয়ে b
অভ্যন্তরের মানটি অ্যাক্সেস করতে পারেন । আমার ধারণা অনুযায়ী এটি একই উদ্দেশ্যে কাজ করে। let
it
a
ব্লক কোডের আগে সুইফ্ট কোডটি অ্যাসাইনমেন্টটি সম্পূর্ণ করে । এবং a
ভিতরে প্রবেশ করা যেতে পারে।
a
? তাহলে এটা b
, তারপর it
সঠিক একই উদ্দেশ্য করে তোলে। এটি -ব্লক-এর a
ফলাফলের সাথে পুনরায় সাইন করে val
?
it
মধ্যে থেকে অ্যাক্সেস করতে পারবেন let
। let
বা run
ব্লকের ফলাফল নির্ধারিত হবে a
। ফলাফলটি ব্লকের সর্বশেষ প্রকাশ। আপনি অন্য কোনও সাধারণ অ্যাসাইনমেন্টের সাথে ঠিক যেমনভাবে কাজটি শেষ / শেষ করার পরে ব্যবহার করেন let
/ run
আসুন প্রথমে নিশ্চিত করা যাক আমরা সরবরাহিত সুইফট আইডিয়ামের শব্দার্থক শব্দগুলি বুঝতে পারি:
if let a = <expr> {
// then-block
}
else {
// else-block
}
এর অর্থ এটি: "যদি <expr>
ফলাফলটি একটি then
শূন্যস্থানবিহীন in চ্ছিক হয় তবে আন - র্যাপড মানটির সাথে a
আবদ্ধ প্রতীকটি দিয়ে -ব্লকটি প্রবেশ করান Otherwise অন্যথায় else
ব্লকটি প্রবেশ করুন ।
বিশেষত দ্রষ্টব্য যে কেবল -ব্লকের মধ্যেa
আবদ্ধ । কোটলিনে আপনি কল করে সহজেই এটি পেতে পারেনthen
<expr>?.also { a ->
// then-block
}
এবং আপনি else
এটির মতো একটি ব্লক যুক্ত করতে পারেন :
<expr>?.also { a ->
// then-block
} ?: run {
// else-block
}
এটি সুইফট আইডিয়াম হিসাবে একই শব্দার্থবিজ্ঞানের ফলাফল।
আমার উত্তর সম্পূর্ণরূপে অন্যদের একটি অনুলিপি বিড়াল। তবে আমি তাদের প্রকাশ সহজে বুঝতে পারি না। সুতরাং আমি অনুমান করি যে এটি আরও বোধগম্য উত্তর সরবরাহ করা ভাল হবে।
দ্রুত:
if let a = b.val {
//use "a" as unwrapped
}
else {
}
কোটলিনে:
b.val?.let{a ->
//use "a" as unwrapped
} ?: run{
//else case
}
let
পরিবর্তে ব্যবহার করা also
মানে এই যে run
ব্লকটি যখনই let
ফিরে আসবে তখন কার্যকর হবে null
, যা আমরা চাই না।
সুইফ্টের বিপরীতে, কোটলিনে এটি ব্যবহার করার আগে এটি alচ্ছিকভাবে মোড়ানো দরকার নয়। আমরা কেবল মানটি নাল নয় কিনা তা যাচাই করতে পারি এবং সংকলকটি আপনার সম্পাদিত চেক সম্পর্কিত তথ্য ট্র্যাক করে এবং এটি মোড়ক হিসাবে ব্যবহার করার অনুমতি দেয়।
সুইফটে:
if let a = b.val {
//use "a" as unwrapped
} else {
}
কোটলিনে:
if b.val != null {
//use "b.val" as unwrapped
} else {
}
পড়ুন ডকুমেন্টেশন: (নাল-নিরাপত্তা) বেশি ব্যবহারের ক্ষেত্রে জন্য
if let
বিবৃতি।বিকল্পের কোনও মান রয়েছে কিনা তা খুঁজে বের করার জন্য সুইফটস Optional Binding
(তথাকথিত if-let
বিবৃতি) ব্যবহৃত হয় এবং যদি তাই হয় তবে সেই মানটি অস্থায়ী ধ্রুবক বা পরিবর্তনশীল হিসাবে উপলব্ধ করতে ব্যবহৃত হয়। সুতরাং, একটি Optional Binding
জন্যif-let
বিবৃতিটির নিম্নরূপ:
সুইফটের
if-let
বক্তব্য:
let b: Int? = 50
if let a = b {
print("Good news!")
} else {
print("Equal to 'nil' or not set")
}
/* RESULT: Good news! */
কোটলিনে, সুইফ্টের মতো, কোনও প্রত্যাশিত প্রত্যাশার পরে নাল মান অ্যাক্সেস করার চেষ্টা করার ফলে ক্রাশ হওয়া এড়াতে, b.let { }
সঠিকভাবে মোড়ক দেওয়ার জন্য একটি নির্দিষ্ট সিনট্যাক্স (যেমন দ্বিতীয় উদাহরণের মতো) সরবরাহ করা হয়nullable types
:
কোটলিন সুইফটের
if-let
বক্তব্যের সমতুল্য 1 :
val b: Int? = null
val a = b
if (a != null) {
println("Good news!")
} else {
println("Equal to 'null' or not set")
}
/* RESULT: Equal to 'null' or not set */
কোটলিনের let
ফাংশন, যখন নিরাপদ কল অপারেটরের সাথে একত্রে ব্যবহৃত হয়?:
নালাগুলি ভাবগুলি হ্যান্ডেল করার জন্য একটি সংক্ষিপ্ত উপায় সরবরাহ করে।
কোলটিন সমতুল্য 2 (ইনলাইন ফাংশন এবং এলভিস অপারেটর) সুইফটের
if-let
বক্তব্যটির:
val b: Int? = null
val a = b.let { nonNullable -> nonNullable } ?: "Equal to 'null' or not set"
println(a)
/* RESULT: Equal to 'null' or not set */
guard let
বিবৃতি।guard-let
সুইফটে বিবৃতিটি সহজ এবং শক্তিশালী। এটি কিছু শর্ত পরীক্ষা করে এবং যদি এটি মিথ্যা বলে মূল্যায়ন করে, তবেelse
বিবৃতি কার্যকর করে যা সাধারণত কোনও পদ্ধতি থেকে প্রস্থান করবে।
একটি সুইফটের
guard-let
বক্তব্যটি ঘুরে দেখি :
let b: Int? = nil
func testIt() {
guard let a = b else {
print("Equal to 'nil' or not set")
return
}
print("Good news!")
}
testIt()
/* RESULT: Equal to 'nil' or not set */
Kotlin এর অনুরূপ প্রভাব এর সুইফট এর
guard-let
বক্তব্যটির :
সুইট-এর বিপরীতে, কোটলিনে, কোনও গার্ড বিবৃতি নেই is তবে, আপনি একই ব্যবহার করতে Elvis Operator
- এটি ব্যবহার করতে পারেন ?:
।
val b: Int? = 50
fun testIt() {
val a = b ?: return println("Equal to 'null' or not set")
return println("Good news!")
}
testIt()
/* RESULT: Good news! */
আশাকরি এটা সাহায্য করবে.
name
শূন্য না হলে কেবল কোড সম্পাদন করার পদ্ধতি এখানে রয়েছে :
var name: String? = null
name?.let { nameUnwrapp ->
println(nameUnwrapp) // not printed because name was null
}
name = "Alex"
name?.let { nameUnwrapp ->
println(nameUnwrapp) // printed "Alex"
}
let
করে, তবে প্রশ্নটি সেই else
কৌশলটি সম্পর্কে কার্যকর করা হয় যা কার্যকর let
করা হয় এমন বস্তুটি যদি তা বলা হয় null
। সুইফট এটিকে আরও প্রাকৃতিক (তর্কযোগ্য) উপায়ে দিয়েছে। কিন্তু কোটলিন এবং সুইফট উভয়ই অনেক কাজ করার পরে, আমি চাই কোটলিনের সুইফ্টের মতো একটি সরল আনরোপিং থাকত।
এখানে আমার বৈকল্পিক, খুব সাধারণ "যদি নাল না হয়" ক্ষেত্রে সীমাবদ্ধ।
প্রথমত, কোথাও এটি সংজ্ঞায়িত করুন:
inline fun <T> ifNotNull(obj: T?, block: (T) -> Unit) {
if (obj != null) {
block(obj)
}
}
এটা সম্ভবত হওয়া উচিত internal
, দ্বন্দ্ব এড়ানোর জন্য।
এখন, এই সুইফট কোডটি রূপান্তর করুন:
if let item = obj.item {
doSomething(item)
}
এই কোটলিন কোডটিতে:
ifNotNull(obj.item) { item ->
doSomething(item)
}
মনে রাখবেন যে কোটলিনে সর্বদা ব্লকের সাথে আপনি যুক্তিটি ফেলে দিতে পারেন এবং ব্যবহার করতে পারেন it
:
ifNotNull(obj.item) {
doSomething(it)
}
তবে যদি ব্লকটি 1-2 টি লাইনের বেশি হয় তবে স্পষ্ট করে বলা ভাল।
এটি সুইফ্টের মতোই সন্ধান করতে পারলাম।
সুইট-এর স্টাইলটি যদি হয় তবে তা অর্জনের জন্য কোটলিনে একই ধরণের উপায় রয়েছে
if (val a = b) {
a.doFirst()
a.doSecond()
}
আপনি একাধিক nallable মান নির্ধারণ করতে পারেন
if (val name = nullableName, val age = nullableAge) {
doSomething(name, age)
}
এই ধরণের পদ্ধতিকে আরও উপযুক্ত হবে যদি 1 টিরও বেশি সময় ধরে অযোগ্য মানগুলি ব্যবহার করা হয়। আমার মতে, এটি পারফরম্যান্স দিক থেকে সহায়তা করে কারণ অণ্যযোগ্য মানটি একবারে পরীক্ষা করা হবে।
উত্স: কোটলিন আলোচনা
আমি এই উত্তরটি গ্রহণযোগ্য উত্তর স্পষ্ট করার জন্য যুক্ত করছি কারণ এটি একটি মন্তব্যের পক্ষে খুব বড়।
এখানে সাধারণ প্যাটার্নটি হ'ল আপনি এলভিস অপারেটর দ্বারা পৃথক পৃথকভাবে কোটলিনে উপলব্ধ স্কোপ ফাংশনগুলির যে কোনও সংমিশ্রণটি ব্যবহার করতে পারেন :
<nullable>?.<scope function> {
// code if not null
} :? <scope function> {
// code if null
}
উদাহরণ স্বরূপ:
val gradedStudent = student?.apply {
grade = newGrade
} :? with(newGrade) {
Student().apply { grade = newGrade }
}
a
ভিতরে অ্যাক্সেসlet
এবংrun
ব্লক করা যাবে না ।