বুলিয়ান ব্যবহার? যদি অভিব্যক্তি


130

আমার যদি একটি অবনমিত হয় তবে আমি Boolean bজাভাতে নিম্নলিখিত তুলনাটি করতে পারি:

Boolean b = ...;
if (b != null && b) {
   /* Do something */
} else {
   /* Do something else */
}

কোটলিনে, আমি !!অপারেটরটি ব্যবহার করে এটি অর্জন করতে পারি :

val b: Boolean? = ...
if (b != null && b!!) {
   /* Do something */
} else {
   /* Do something else */
}

যাইহোক, এর ব্যবহারটি !!আমার কাছে কিছুটা স্কেচি মনে হয়, নাল সুরক্ষা ব্যবস্থাটিকে অবরুদ্ধ করে।

এর জন্য আরও কি মার্জিত পদ্ধতি আছে?


সম্পাদনা দেখে মনে হচ্ছে আমি কিছুটা চাপ ফেলেছি। স্থানীয় ভেরিয়েবলগুলির জন্য, যেমন বাথার দেখায়, এটি কাজ করে। তবে, আমার বুলিয়ান bআসলে "একটি ব্যাকিং ফিল্ড সহ সম্পত্তি" (এটি বাস্তবায়িত করার জন্য আমি এখনও গতি বাড়ানোর পক্ষে নেই)। এটি ফলাফল:

এখানে চিত্র বর্ণনা লিখুন


আপনার প্রয়োজন !!bএবং সহজভাবে কেন নয় b? (আমি কোটলিনের সাথে তেমন পরিচিত নই, কেবল কৌতূহলগুলি)
মারুন

1
@ মারআউনমারাউন যেহেতু bহতে পারে nullএবং কোটলিনের অন্যতম বৈশিষ্ট্য হ'ল নল সুরক্ষা , যা সংক্ষিপ্ত উল্লেখগুলি মূল্যায়নের চেষ্টা করার সময় সংকলন ত্রুটি দেয়। সুতরাং, সরল ব্যবহার bএকটি সংকলন ত্রুটি দেয় :)
nhaarman

তবে b != nilডান দিকটি যাচাই করার আগে তা ধরবে না ?
মারউন

আপনি সত্যিই বলতে হবে, কিন্তু আমার আইডিই অন্যথায় বলে। আমি মনে করি যে এর মতো কিছু কাজ করা উচিত, আমি কিছু খুঁজে পেতে পারি কিনা তা আমি দেখব।
nhaarman

আমার মনে হয় val r = b?doSomething() ?: doSomethingElse()কাজ করা উচিত।
মারুন

উত্তর:


183

আপনার সাথে nullable বুলিয়ান তুলনা করতে পারবেন true, falseবা nullসমতা অপারেটর ব্যবহার করছে:

var b: Boolean? = null
if (b == true) {
    // b was not null and equal true
} 
if (b == false) {
   // b is false 
}
if (b != true) { 
   // b is null or false 
}

4
দ্রষ্টব্য: বিপরীত অপারেটরের সাথে কাজ করছে বলে মনে হচ্ছে না!
রিচার্ড

7
@Richard এটি একটি থাকার 3 সম্ভাব্য মান হিসাবে খ ভাবতে সাহায্য করে: true, falseবা null। তারপরে যখন if (b != true)আপনি কেবল তা জানেন যে খ সত্য নয়, তবে আপনি falseবা সম্পর্কে কিছুই জানেন নাnull
jivimberg

7
eg2। if (b != true) // b is null or falseeg3। if (b == false) // b is false
এইচএমএক

এটি সঠিক উত্তর এবং কোটলিনে তা উপলব্ধি করে তবে জাভা ব্যাকগ্রাউন্ড থেকে আসা কোনও বিবৃতিতে স্পষ্টভাবে সত্য বা মিথ্যা বা নালীর সাথে তুলনা করা অদ্ভুত বোধ করতে পারে, এটি ব্যাখ্যা করতে পারে যে কেন এটি এত জনপ্রিয় প্রশ্ন এবং উত্তর।
মাইকেল পিটারসন

31

আপনি পরিচ্ছন্নভাবে চেক করতে চান যদি একটি কিনা Boolean?হয় trueবা falseআপনি কি করতে পারেন:

when(b) {
    true -> {}
    false -> {}
}

আপনি যদি এটি পরীক্ষা করতে চান তবে এটির null(বা else) কোনও মান হিসাবে যুক্ত করতে পারেন when:

when(b) {
    true -> {}
    false -> {}
    null -> {}
}

when(b) {
    true -> {}
    false -> {}
    else-> {}
}

22

কোটলিন আপনার নাল চেকগুলি স্থিতিশীলভাবে বিশ্লেষণ করবে। ্রফ:

val b: Boolean? = null
if (b != null && b) {
    println(b)
}

যদিও এটি টাইপ ত্রুটিতে ব্যর্থ হয়:

val b: Boolean? = null
if (b == null && b) {
    println(b)
}

আরও তথ্যের জন্য: http://kotlinlang.org/docs/references/null-safety.html

আপনি "নাল কোয়েলসিং অপারেটর" (যা পরিবর্তনশীল ভেরিয়েবলগুলির জন্য কাজ করবে) ব্যবহার করতে পারেন:

val b: Boolean? = null
if (b ?: false) {
    println(b)
}

বিশ্লেষণ কেবলমাত্র পরিবর্তনযোগ্য মূল্যবোধের জন্য কাজ করে। যদি আপনাকে কোনও পরিবর্তনীয় ক্ষেত্রটি করতে হয় তবে এটি অস্থায়ী স্থানীয় ভেরিয়েবলে সংরক্ষণ করুন।
পাইটর প্রস্ম্মো

1
আসলেই তা বোঝায়। নাল কোলেসিং অপারেটর সম্ভবত আমি যা খুঁজছিলাম। ধন্যবাদ!
nhaarman

@ বাথার যা সম্পূর্ণ সঠিক নয় (আপনার দ্বিতীয় উদাহরণটি হবে var?) ... এটি যদি স্থানীয় হয় varতবে সংকলকটি এখনও নিরাপদ অভিনেতাকে অনুমতি দিতে পারে। আরও বিশেষ ক্ষেত্রে, স্ট্যাকওভারফ্লো
জয়সন মিনার্ড

নাল কোলেসিং এলভিসকে অ্যাসাইনমেন্টে স্থানান্তরিত করা যেতে পারেval booleanVal = nullableProducer?.produceVal() ?: false; if (booleanVal) {}
সার্জ

6

আমি বুলিয়ান কি দেখেছি? এমন একটি পদ্ধতির ফলাফল যা বুলিয়ানকে এমন কোনও বস্তুর উপরে ফিরিয়ে দেয় যা অযোগ্য

val person: Person? = null
....
if(person?.isHome()) { //This won't compile because the result is Boolean?
  //Do something
}

আমি যে সমাধানটি ব্যবহার করছি তা হ'ল letফাংশনটি ব্যবহার করে সম্ভাব্য প্রত্যাশিত নাল মানটিকে সরাতে

person?.let {
  if(it.isHome()) {
    //Do something
  }
}

5
আপনি যদি ifব্লকটি প্রতিস্থাপন করেন তবে প্রথমটি সংকলন করে person?.isHome() == true
হেসাম

2

কোটলিনে আপনি এটি করতে পারেন:

val b: Boolean? = true
if (b == true) { // if b is null, this should be null == true
    /* Do something */
} else {
    /* Do something else */
}

3
b != null && b == trueহিসাবে একই b == true
nhaarman

1

প্রথমে নীচে কাস্টম ইনলাইন ফাংশন যুক্ত করুন:

inline fun Boolean?.ifTrue(block: Boolean.() -> Unit): Boolean? {
    if (this == true) {
        block()
    }
    return this
}

inline fun Boolean?.ifFalse(block: Boolean?.() -> Unit): Boolean? {
    if (null == this || !this) {
        block()
    }

    return this
}

তাহলে আপনি এই জাতীয় কোড লিখতে পারেন:

val b: Boolean? = ...
b.ifTrue {
   /* Do something in true case */
}

//or

b.ifFalse {
   /* Do something else in false case */
}

হ্যাঁ, ক্ষেত্রে: b.ifTrue {...} বা b.ifFalse {...} এটি কার্যকর হতে পারে
জাইস জাইসি

1

কোটলিনের জন্য আমি সাধারণত যা ব্যবহার করি তা হ'ল

if (object?.booleanProperty ==true)
   { 
     //do stuff 
   }

এটি কেবল তখনই কাজ করবে যখন সম্পত্তিটি সত্য হয় এবং অবজেক্ট নাল নয়। বিপরীতে:

if (!object?booleanProperty !=true)
   { 
     //do Stuff
   }

0

এর if-elseসাথে একটি বিবৃতি ব্যবহার করা যাক Elvis Operator:

val a: Boolean?
val b: Boolean?

a = true
b = null

if (a != null ?: b) { 
    println("One of them isn't nullable...")
} else {
    println("Both are nullables!")
}

// ফলাফল: "এর মধ্যে একটিও নিষ্ক্রিয় নয় ..."

a = null
b = null

if (a != null ?: b) { 
    println("One of them isn't nullable...")
} else {
    println("Both are nullables!")
}

// ফলাফল: "উভয়ই শাবক!"


0

এটি যদি আপনাকে সহায়তা করে তবে এক্সটেনশন ফাংশন যুক্ত করা বেশ সহজ।

fun Boolean?.orDefault(default: Boolean = false): Boolean {
    if (this == null)
        return default
    return this
}

var x: Boolean? = null

if(x.orDefault()) {
..
}

0

যদি আপনি একইভাবে কাজগুলি করতে চান তাহলে containএকটি উপর Stringআপনি নীচের মত সমতা চেক ব্যবহার করতে পারে -

if (url?.contains("xxx") == true){
  return false;
}

-1

আপনি নিরাপদ অপারেটর "লেট" দিয়ে করতে পারেন

val b: Boolean? = null
b?.let { flag ->
    if(flag){
        // true Block
    } else {
        // false Block
    }
}

এটি কেবল সত্য নয়, এবং নিক্ষিপ্ত ব্যতীত ফিরে আসবে।
nhaarman

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