如果你去商店询问“现金或信用卡?”他们可能会简单地说“是”。当你提出OR
声明时,这并没有告诉你任何事情。 if(cash || credit)
对于人类来说,他们可能会回答“两者”这个问题,或“只有{现金|信用}”。有没有办法(或运算符)强制a语句返回语句的TRUE
部分?例如:
boolean cash = true;
boolean credit = true;
boolean check = false;
if(cash || credit || check)
{
// In here you would have an array with cash and credit in it because both of those are true
}
我想指出,这是不我正试图解决的问题。这是我在考虑的事情,并且想知道是否可能。我想不出我会拥有的实用应用程序。
答案 0 :(得分:10)
在C#中,您可以使用设置了Flags属性的枚举来执行与此类似的操作。
[Flags]
enum MethodOfPayment
{
None = 0,
Cash = 1,
Credit = 2,
Check = 4
}
使用示例:
void Run()
{
MethodOfPayment m = MethodOfPayment.Cash | MethodOfPayment.Credit;
if (m != MethodOfPayment.None)
{
// You can now test m to see which values are selected.
// If you really want the values in an array, you can do this:
MethodOfPayment[] selected = getSelectedValues(m).ToArray();
// selected now contains { Cash, Credit }
}
}
// Helper method to get the selected values from the enum.
IEnumerable<MethodOfPayment> getSelectedValues(MethodOfPayment m)
{
foreach (MethodOfPayment x in Enum.GetValues(typeof(MethodOfPayment)))
{
if ((m & x) != MethodOfPayment.None)
yield return x;
}
}
答案 1 :(得分:5)
在Scala中,您可以使用匹配语句
编写以下内容def OneOrTheOther( _1:Boolean, _2:Boolean ) = {
(_1, _2) match{
case True, False => //do stuff
case False, True => //do stuff
case True, True => //do stuff
case False, False =>//do stuff
}
}
我喜欢比赛表达。
答案 2 :(得分:3)
这是使用位掩码的目的。这是一个很好的概述(示例代码使用数据库权限作为示例)
答案 3 :(得分:3)
我认为这种有点人为的情况并不是你想要回答的,所以我会假设在其他情况下有一些价值。
在具有功能构造的语言中,您可以从集合中“选择”与条件匹配的项目。
在Ruby中:
payment={cash=>true, credit=>true, check=>false}
methods_used=payment.select{ |key,value| value==true}.map { |key,value| key}
收益率[:现金,:贷方]
在C#3中:
var payment = new Dictionary<string, bool>
{{"cash", true}, {"credit",true}, {"check", false}};
var items=payment.Where(x => x.Value == true).Select(x => x.Key);
Console.WriteLine(String.Join(",",items.ToArray()));
在我能想到的大多数语言中,如果不将变量添加到集合或字典中,就不能直接从变量绑定中执行操作。可能存在某种异常,但我无法想到一个例外。
更近似的可能是Haskell,F#和OCaml等语言中的模式匹配,但我仍然无法找到让它看起来像你暗示的方式。
在Boo中,您可以更改编译器管道,以使用能够提供所需内容的内容替换if语句的语义。我可能会使用替代关键字,但您基本上可以提取所有子表达式,并将变量名称添加到块的范围,或者将“是”值添加到一个集合,将“nos”添加到另一个集合,并添加一个按惯例命名变量。为了有效地实现它,你可能不得不打破短路评估的惯例,这会使大多数人习惯于当代编程语言设计。
答案 4 :(得分:2)
我认为你的目标是什么(如果我错了,请纠正我,因为我不是100%肯定在这里)是这样的:
if (operandA || operandB || operandC || (operandD && operandE))
{
//in here we have access to an environment-created array $TRUE_OPERANDS which stores the operands
//that were TRUE in the most recently evaluated if-statement.
//Maybe it contains the names of operands. suppose that A, C and E were TRUE
//then $TRUE_OPERANDS = {'operandA', 'operandC', 'operandE'}
//...but E was AND'd with D and D was false, so should E still be returned?
//Are E and D considered separate operands or are the considered as a single "E && D" operand?
//...and how would we implement nested if-statements?
//Would there be only one global $TRUE_OPERANDS or would there be one
//for the scope of every if-statement?
}
我不知道有任何语言可以做到这一点(至少不像我在这里说明的那样)。正如许多其他人所提到的,位掩码和枚举通常用于解决这个问题。其他一些人已经在Ruby,Python和C#中发布了可能接近你想要的例子。
答案 5 :(得分:2)
如果您的语言支持,您可以使用列表解析(例如Python):
list = [True, False, True, True]
print [x for x in list if x] # print only the True values
或者,位掩码通常用于此类任务(以及通常便宜且存在于大多数语言中):
CASH = 1
CREDIT = 2
ELSE = 4
myOption = CASH & ELSE
这完全取决于你究竟想要做什么。
答案 6 :(得分:1)
人类语言有时使用“或”一词来表示“独占或”,在许多语言(包括c,c ++和java)中用^
表示。
也就是说,cash ^ credit
评估为true,当且仅当cash
和credit
中的一个为真时。
答案 7 :(得分:1)
从评论中,您似乎在问:任何语言是否会自动为任何被评估的if语句创建该集合?
答案是否定的。至少,不是任何现代语言(C,C#,Java,Haskell,几乎任何东西)。原因是短路。想象一下if if语句:
if (a() || b() || c() || d()) {
}
也就是说,你调用一个函数来获取每个真值。如果a()
的计算结果为true,那么任何现代语言都不会评估任何其他函数,因为它们不会更改整个语句的真值。现在的代码依赖于这种短路,因此更改语言以评估其所有或操作数可能会破坏大量代码。
对于在测试用例中有一组o和只有变量的特殊情况......这是一个非常特殊的情况,如果你想要一套什么,最好使用这里提出的一些其他解决方案是真实的,而不仅仅是否其中任何一个是真的。
答案 8 :(得分:0)