Как заставить логическую переменную переключаться между истиной и ложью каждый раз при вызове метода?

Я пытаюсь написать метод, который при вызове изменяет логическую переменную на true, а при повторном вызове меняет ту же переменную на false и т. Д.

Например: метод вызова -> логическое = true -> метод вызова -> логическое = ложное -> метод вызова -> логическое = истина

Итак, в основном,

if (a = false) { a = true; }
if (a = true) { a = false; }

Я не уверен, как это сделать, потому что каждый раз, когда я вызываю метод, логическое значение меняется на true, а затем снова на false.


person aperson    schedule 19.03.2010    source источник
comment
если это был действительный код, который вы пробовали, помните, что a = false устанавливает значение false, а не тестирует его. используйте a == false или еще лучше !a, чтобы проверить, ложно ли логическое значение.   -  person Evan Teran    schedule 19.03.2010
comment
не будет просто установить a = true, который затем запускает второе if и снова устанавливает a = false. вам нужно, если еще на вашей второй строке   -  person Horse    schedule 29.08.2012


Ответы (10)


value ^= true;

Это значение xor-equals true, которое будет переворачивать его каждый раз без каких-либо ветвлений или временных переменных.

person ILMTitan    schedule 19.03.2010
comment
Обычно есть более понятные способы сделать это, например, ответ Рэнди. - person Adriano Varoli Piazza; 01.09.2011
comment
Я согласен, это менее читабельно. Тем не менее, я не думаю, что это неаккуратные и не неправильные два критерия, предложенные для голосования против. - person ILMTitan; 01.09.2011
comment
Смотря как. Если функция класса или значительная часть его внутреннего состояния принципиально переключаемая, тогда да: указана функция toggleFoo (), и она, вероятно, более читабельна. Однако, если логическое значение является локальной переменной, foo ^ = true отлично читается и не загромождает класс нерелевантными методами. - person KarlP; 24.04.2013
comment
никогда раньше не видел такого флипа, голосуйте за вдохновение! - person zionpi; 27.08.2015
comment
Мне это нравится. Хотя традиционный a =! A работает довольно хорошо (и, поправьте меня, если я ошибаюсь, он немного более эффективен), это хорошая альтернатива для переменных с длинными именами. Хороший способ улучшить читаемость. - person Math Machine; 05.08.2020

Не глядя на него, установите не на себя. Я не знаю, как это кодировать на Java, но в Objective-C я бы сказал

booleanVariable = !booleanVariable;

Это переворачивает переменную.

person JoePasq    schedule 19.03.2010
comment
То же самое и на Java. - person MinecraftShamrock; 17.06.2014

Просто переключайтесь каждый раз, когда он вызывается

this.boolValue = !this.boolValue;
person Randy Simon    schedule 19.03.2010

Предполагая, что приведенный выше код является фактическим кодом, у вас есть две проблемы:

1) ваши операторы if должны быть '==', а не '='. Вы хотите проводить сравнение, а не назначение.

2) Второе if должно быть else if. В противном случае, когда это ложь, вы установите для него значение true, затем будет оценено второе if, и вы вернете его в значение false, как вы описываете.

if (a == false) {
  a = true;
} else if (a == true) {
  a = false;
}

Еще одна вещь, которая могла бы сделать это еще проще, - это '!' оператор:

a = !a;

переключит значение a.

person bobDevil    schedule 19.03.2010
comment
Второе if, if (a == true) даже не обязательно, достаточно else, если только это не логическое значение, которое может иметь нулевое значение. - person extraneon; 19.03.2010
comment
Верно, но я всегда предпочитаю ошибаться в том, чтобы быть явным в своих намерениях, особенно при ответах на подобные вопросы. - person bobDevil; 19.03.2010

Я делаю это с boolean = !boolean;

person GFP    schedule 08.07.2013

value = (value) ? false : true;

Условный (тернарный) оператор.

person whirlwin    schedule 25.02.2011

var logged_in = false;
logged_in = !logged_in;

Небольшой пример:

var logged_in = false;


$("#enable").click(function() {
    logged_in = !logged_in;
    checkLogin();
});

function checkLogin(){
    if (logged_in)
        $("#id_test").removeClass("test").addClass("test_hidde");
    else
        $("#id_test").removeClass("test_hidde").addClass("test");
    $("#id_test").text($("#id_test").text()+', '+logged_in);
}
.test{
    color: red;
    font-size: 16px;
    width: 100000px
}

.test_hidde{
    color: #000;
    font-size: 26px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="test" id="id_test">Some Content...</div>
<div style="display: none" id="id_test">Some Other Content...</div>


<div>
    <button id="enable">Edit</button>
</div>

person EvilInside    schedule 27.03.2015

private boolean negate(boolean val) {
    return !val;
}

Я думаю, это то, о чем вы просите ??

person rayd09    schedule 19.03.2010

в java, когда вы устанавливаете значение переменной, оно возвращает новое значение. Так

private boolean getValue()
{
     return value = !value;
}
person bmavus    schedule 17.09.2018

вот несколько способов сделать это, выберите тот, который вам нравится:

//set a bool variable to true
bool myBool = true;
print (myBool); //:true

//set 'myBool' to not itself
myBool = !myBool;
print (myBool); //:false

//ternary myBool: if it's true return false, if it's false return true
myBool = myBool ? false : true;
print (myBool); //:true

//ternary !myBool, same as last one but inverted (because why not)
myBool = !myBool ? true : false;
print (myBool); //:false

//set myBool to not itself and true
myBool = !(myBool && true)
print (myBool); //:true

Шутки в сторону, я всегда хотел, чтобы функция вызывалась, например, myBool.switch(), чтобы установить ее не в себя и вернуть новое значение, не могу найти никаких недостатков для этого.

person talevineto    schedule 20.07.2021