एक और विकल्प (यदि आपके पास डेल्फी के लिए अपेक्षाकृत आधुनिक संस्करण है) तो इसे रिकॉर्ड के रूप में कार्यान्वित करना है, जिसमें बुलियन मूल्यों से और उसके लिए निहित रूपांतरण शामिल है। ऑपरेटर अधिभार के साथ, आप 3-राज्य तर्क भी सक्षम कर सकते हैं। यदि आपको आवश्यकता होती है तो यह ओवरकिल होता है, लेकिन यदि आपको तीन-राज्य तर्क प्रणाली की आवश्यकता होती है तो यह बहुत अच्छी तरह से काम करता है, खासकर जब आप इसे बूलियन मान निर्दिष्ट कर सकते हैं। 3-राज्य से 2-राज्य विचारों के असाइनमेंट से सावधान रहें। नीचे दिया गया उदाहरण बूलियन < - 'ट्रोलियन' असाइनमेंट में झूठा असाइन करता है जहां डेलीफी में एक असाइन किए गए बूलियन के अनुसार, ट्रोलियन टीएनआईएल है, लेकिन स्पष्ट जटिलताओं हैं।
कृपया ध्यान दें कि यह किसी भी माध्यम से पूर्ण या कुशल कार्यान्वयन नहीं है, यह संभव है कि यह संभवतः अभियोग करने के लिए एक डेमो है। संयोग से, जेरोइन प्लूइमर द्वारा निरर्थक प्रकारों पर एक अच्छा CodeRage vidoe है। This प्रश्न एक लिंक प्रदान करता है।
unit UnitTroolean;
interface
type
TTroolean = record
private type
TThreeState = (TTrue = 1, TFalse = 0, TNil = -1);
var
fThreeState: TThreeState;
public
function AsString: string;
class operator Implicit(Value: boolean): TTroolean;
class operator Implicit(Value: TTroolean): boolean;
class operator Implicit(Value: TThreeState): TTroolean;
class operator Implicit(Value: TTroolean): TThreeState;
class operator LogicalAnd(Left, Right: TTroolean): TTroolean;
class operator LogicalOr(Left, Right: TTroolean): TTroolean;
class operator LogicalNot(Value: TTroolean): TTroolean;
end;
implementation
{ TRoolean }
class operator TTroolean.Implicit(Value: boolean): TTroolean;
begin
if Value then
result.fThreeState := TTrue
else
result.fThreeState := TFalse;
end;
class operator TTroolean.Implicit(Value: TTroolean): boolean;
begin
if not(Value.fThreeState = TNil) then
result := (Value.fThreeState = TTrue)
else
result := false;
end;
class operator TTroolean.Implicit(Value: TThreeState): TTroolean;
begin
result.fThreeState := Value;
end;
class operator TTroolean.Implicit(Value: TTroolean): TThreeState;
begin
result := Value.fThreeState;
end;
class operator TTroolean.LogicalAnd(Left, Right: TTroolean): TTroolean;
begin
if (Left.fThreeState = TNil) or (Right.fThreeState = TNil) then
result.fThreeState := TNil
else if ((Left.fThreeState = TTrue) and (Right.fThreeState = TTrue)) then
result.fThreeState := TTrue
else
result.fThreeState := TFalse;
end;
class operator TTroolean.LogicalNot(Value: TTroolean): TTroolean;
begin
begin
case value.fThreeState of
TNil: result.fThreeState:= TNil;
TTrue: result.fThreeState:= TFalse;
TFalse: result.fThreeState:= TTrue
end;
end;
end;
class operator TTroolean.LogicalOr(Left, Right: TTroolean): TTroolean;
begin
if (Left.fThreeState = TNil) or (Right.fThreeState = TNil) then
result.fThreeState := TNil
else if ((Left.fThreeState = TTrue) or (Right.fThreeState = TTrue)) then
result.fThreeState := TTrue
else
result.fThreeState := TFalse;
end;
function TTroolean.AsString: string;
begin
case ord(fThreeState) of
1:
result := 'TTrue';
0:
result := 'TFalse';
-1:
result := 'TNil';
end;
end;
end.
और उपयोग
program ThreeStateLogicTest;
{$APPTYPE CONSOLE}
uses
SysUtils,
UnitTroolean in 'UnitTroolean.pas';
var
ABoolean: boolean;
ATroolean, Anothertroolean, AThirdTroolean: TTroolean;
begin
try
{ TODO -oUser -cConsole Main : Insert code here }
write('Boolean:', BoolToStr(ABoolean, true), #10#13);
write(#10#13);
ATroolean := TFalse;
ABoolean := true;
ATroolean := ABoolean;
write('Boolean:', BoolToStr(ABoolean, true), #10#13);
write('Troolean:', ATroolean.AsString, #10#13);
write('Troolean as Boolean:', BoolToStr(ATroolean, true), #10#13);
write(#10#13);
ATroolean := TTrue;
ABoolean := false;
ATroolean := ABoolean;
write('Boolean:', BoolToStr(ABoolean, true), #10#13);
write('Troolean:', ATroolean.AsString, #10#13);
write('Troolean as Boolean:', BoolToStr(ATroolean, true), #10#13);
write(#10#13);
ABoolean := false;
ATroolean := TTrue;
ABoolean := ATroolean;
write('Boolean:', BoolToStr(ABoolean, true), #10#13);
write('Troolean:', ATroolean.AsString, #10#13);
write('Troolean as Boolean:', BoolToStr(ATroolean, true), #10#13);
write(#10#13);
ABoolean := true;
ATroolean := TFalse;
ABoolean := ATroolean;
write('Boolean:', BoolToStr(ABoolean, true), #10#13);
write('Troolean:', ATroolean.AsString, #10#13);
write('Troolean as Boolean:', BoolToStr(ATroolean, true), #10#13);
write(#10#13);
ABoolean := false;
ATroolean := Tnil;
ABoolean := ATroolean;
write('Boolean:', BoolToStr(ABoolean, true), #10#13);
write('Troolean:', ATroolean.AsString, #10#13);
write('Troolean as Boolean:', BoolToStr(ATroolean, true), #10#13);
write(#10#13);
ABoolean := true;
ATroolean := Tnil;
ABoolean := ATroolean;
write('Boolean:', BoolToStr(ABoolean, true), #10#13);
write('Troolean:', ATroolean.AsString, #10#13);
write('Troolean as Boolean:', BoolToStr(ATroolean, true), #10#13);
write(#10#13);
ATroolean := TTrue;
Anothertroolean := false;
AThirdTroolean := ATroolean and Anothertroolean;
write('And:', AThirdTroolean.AsString, #10#13);
AThirdTroolean := ATroolean or Anothertroolean;
write('Or:', AThirdTroolean.AsString, #10#13);
ATroolean := TNil;
Anothertroolean:= not ATroolean;
write('Not TNil:', Anothertroolean.AsString, #10#13);
ATroolean := TTrue;
Anothertroolean:= not ATroolean;
write('Not Ttrue:', Anothertroolean.AsString, #10#13);
ATroolean := Tfalse;
Anothertroolean:= not ATroolean;
write('Not Tfalse:', Anothertroolean.AsString, #10#13);
readln;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
+1 यह प्राप्त करने का यह सबसे अच्छा तरीका है, आईएमओ। तीन राज्य हैं: 'कुछ करो (1)', 'कुछ करो (1, सही)' और 'कुछ करो (1, झूठा) '। –
@ रुडी, हाँ, लेकिन केवल इसलिए कि ओपी ने * बूलियन * पैरामीटर के साथ काम करने की आवश्यकता निर्दिष्ट की है। अन्यथा मुझे लगता है कि 3 अलग-अलग कोड पथ एक 3 राज्य परिवर्तनीय (जैसे ग्रेग हेगिल के थ्रीस्टेटबोलियन उदाहरण) का उपयोग करके अधिक कुशलतापूर्वक विभेदित होते हैं। – Sam
@ रुडी, यह बेहतर जवाब क्या बनाता है कि यह ओपी की वाक्य का अनुपालन करता है "कभी-कभी हम एक वैकल्पिक पैरामीटर चाहते हैं", यह तथ्य नहीं कि तीन राज्य समर्थित हैं (क्योंकि दोनों उत्तरों ऐसा करते हैं)। IMO। – Sam