2012-06-05 4 views
0

Мне нужно создать глобальное булево значение с двумя условиями a и b, чтобы, если A всегда истинно, логическое значение истинно до тех пор, пока b не будет истинным, и в этом случае логическое значение будет ложным. Другими словами, если A становится ложным, логическое значение остается истинным.JavaScript set boolean по отдельным условиям?

Я пробовал простую глобальную переменную, но он стал ложным, когда A стал ложным.

Предпочтительно JavaScript, но псевдокод будет почти таким же полезным.

+0

Звучит как логический эквивалент триггерной схемы. –

+0

Есть ли только один A и один B или требуется ли его повторное использование? –

+0

Я считаю, что флип-флоп верен. Да, только один a и b – jamesson

ответ

2

Это звучит как XOR. т.е.

!A and !B == false 
A and !B == true 
!A and B == true 
A and B == false 

К сожалению, JavaScript не имеет логического оператора XOR, однако

если (A B: B!) {

функционально эквивалентен

+0

Я бы сказал «если (A!= B) 'выглядит намного читабельнее – lanzz

+0

В мире с тифами, да, гораздо читабельнее. –

+0

'!! (A^B)' должен работать, поскольку false преобразуется в '0' и true в' 1', а затем результат преобразуется обратно в boolean. На самом деле: '!! (правда^верно) ложных !! (правда^лжи) истинных !! (фальшивого^верно) истинных !! (фальшивой^лжи) false' – Esailija

2

Если я понимаю ваш вопрос должен быть достаточно простым, чтобы сопоставить эти случаи с

var bool = (a != b); 
/* 
    (false != false) = false 
    (true != false) = true 
    (false != true) = true 
    (true != true) = false 
*/ 

С вашими изменениями вы можете создать глобальную переменную var aWasEverTrue = a;, а затем вместо автоматической установки a используйте функцию, например setA(true).

var a = false; 
var b = false; 
var aWasEverTrue = a; 
function setA(newAValue) { 
    aWasEverTrue = true; 
    a = newAValue; 
} 

// (aWasEverTrue != b) = false 

setA(true); 
// (aWasEverTrue != b) = true 

b = true; 
// (aWasEverTrue != b) = false 

setA(false); 
// (aWasEverTrue != b) = false (as aWasEverTrue is still true) 

b = false 
// (aWasEverTrue != b) = true 
+0

Это работает только как Булевы ... Вы можете сделать (! a! =! b) попытку принуждения. –

+0

Опять же, проблема с этими ответами в том, что они игнорируют элемент времени. Мне нужно знать, был ли A _ever_ истинным, прежде чем я тестирую B. Другими словами, он может быть ложным сейчас, но если это было верно в какой-то более ранней точке, я должен проверить B. Если B истинно, глобальный bool является ложным. Спасибо за интерес. – jamesson

+0

Проверьте мои изменения. Я думаю, что это исправить вашу проблему. – h2ooooooo

2

Javascript старой школы путь:

function Enjoy() { 
    this.a = true; 
    this.b = true; 
    this.bool = true; 
} 

Enjoy.prototype = { 
    constructor: Enjoy, 

    setA: function(val) { 
     this.a = val; 
     if (this.a === true && this.b === true) this.bool = false; 
     else if (this.a === true && this.b === false) this.bool = true; 
    }, 

    setB: function(val) { 
     this.b = val; 
     if (this.a === true && this.b === true) this.bool = true; 
     else if (this.a === true && this.b === false) this.bool = false; 
    }, 

    getBool: function() { 
     return this.bool; 
    } 
}; 

var enjoy = new Enjoy(); 
enjoy.getBool(); // true 
enjoy.setB(false); 
enjoy.getBool(); // false 

Как вы можете видеть, идея заключается в том, чтобы использовать геттеры/сеттеры для булева и как a и b переменных, где вы делаете все ваши логики.

Кстати, этот вопрос определенно для StackOverflow.

+0

Похоже, это может сработать, я проверю его в ближайшее время. Большое спасибо! – jamesson

+0

Поскольку 'this.a' и' this.b' устанавливаются * никогда *, кроме конструктора, этот код не будет работать. – Dancrumb

+0

Но разве настройка не выполняется в 'enjoy.setB (false)'? – jamesson

2

Что вы хотите, конечный автомат

States результата:

T (True) 
F (False) 

Переходы:

F -- a (true) --> T 
F -- anything else --> F 
T -- b (true) --> F 
T -- anything else --> T 

Вы можете выразить это с серией if сек

+0

+1, спас меня от написания точного ответа. –

0

Based на некоторых предположениях о том, как должен вести себя, если A не был прав:

function FlipFlop(){ 
    this.latch = false; 
    this.value = false; 
} 

FlipFlop.prototype = { 
    constructor: FlipFlop, 

    setA: function(val) { 
     this.latch = this.latch || !!val; 
     this.value = this.latch; 
    }, 

    setB: function(val) { 
     if(this.latch && !!val) { 
      this.latch = false; 
     } 
     this.value = !val; 
    }, 

    getVal: function() { 
     return this.value; 
    } 
} 
+0

Что такое двоеточие после getVal? Извините, если это gimme, и спасибо заранее – jamesson

+0

Другой вопрос: «Что это за' || = 'оператор? :-) –

+0

Знаете ли вы, что || делает? Сравните с + и + =. Двоеточие - для синтаксиса key: value для литералов объекта. Он определяет член с именем getVal для объекта, который назначается. – phant0m

Смежные вопросы