6

When I try to create Extension Function to set Boolean true or false like the below.

Boolean.setTrue(){
 this = true
}

Boolean.setFalse(){
 this = false
}

It says variable expected. How to achieve this.

Pixel Elephant
  • 19,255
  • 7
  • 64
  • 81
Bhuvanesh BS
  • 12,555
  • 11
  • 37
  • 63

5 Answers5

6

You cannot change the value of this, this would break a lot of assumptions, even if you could you would not be able to change the value, as Booleans are immutable.

More generally, there is a fine line between simplifying code, and making it more complex, and in this case that would complicate it. I would agree that adding String.splitByDot() may make sense, but replacing idiomatic code tends to just make the code more complex, as you start to wonder why the code had to be replaced.

jrtapsell
  • 6,166
  • 1
  • 24
  • 48
3

Sorry but this does not make sense. Just use myBool=false, it's what anyone understands and cannot get any more readable. Also Boolean is immutable and what you're trying isn't possible anyways.

We have to be careful not to overuse extensions. It's one of the greatest features Kotlin (and others) offers, but in certain examples, e.g. trying to change the way a dead simple Boolean is being assigned, it's getting dangerous IMHO (luckily it's not possible).

s1m0nw1
  • 67,502
  • 14
  • 150
  • 189
3

Here is an extension method that works in C# 7.2 or later:

public static class Extensions
{
    public static bool Toggle(ref this bool b) => b = !b;
}

Then elsewhere, something like this will work:

bool     b1 = true; // Works for primitive bool type.
Boolean  b2 = true; // Works for Boolean object, too.
b1.Toggle(); 
b2.Toggle();

The only benefit I see to using an extension method is to shorten lines with long bool expressions, such as replacing:

this.SomeObjectWithALongName.SomeVerboselyNamedProperty
   = !this.SomeObjectWithALongName.SomeVerboselyNamedProperty

with

this.SomeObjectWithALongName.SomeVerboselyNamedProperty.Toggle();

I don't know what drawbacks this extension method may have.

2

The reason you can't do this is that you cannot reassign the receiver in an extension function.

It's not possible to change the value of the Boolean because it is immutable.

JK Ly
  • 2,545
  • 2
  • 16
  • 11
0

The reason you can do this comes to a lack of implementation of Kotlin extension probably due to the fact Extension in Kotlin are resolved Statically (even probably really static). So 'this' in a static context doesn't make sense.

Luc-Olivier
  • 3,358
  • 1
  • 26
  • 27